this的分析分支

最近看到这个题目,开始不太理解,但是仔细的看完this之后,觉得懂了一些

function Foo() {
    getName = function () { alert (1); };
    return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}

//请写出以下输出结果:
Foo.getName();           //2
getName();               //4
Foo().getName();     //1
getName();         //1
new Foo.getName();    //2
new Foo().getName();    //3
new new Foo().getName();   //3

详细分析请看http://www.cnblogs.com/xxcanghai/p/5189353.html#3493461 

我主要说的是前四个:

首先我要说一下我们声明一个对象最常用的几种方式:

var person = new Object();
person.name = "bob";
person.sayName = function(){
    console.info(this.name);
}
person.sayName ();//bob

  

var person = {
    name:‘bob‘,
    sayName:function(){
          console.info(this.name);
    }
}
person.sayName();//bob

 

function Person(){
    this.name="bob",
    this.sayName=function(){
      console.info(this.name);
    }
}
var person1 = new Person();
person1.sayName();//bob   

上面三种方法是很常用的,但是在总结之前我有点混淆了一个问题,就是增加实例属性的时候第一个位置是在函数里面通过this加,this.name= ‘bob‘;或者通过对象实例来加,比如person1.old=12;在Person上直接声明没作用,比如Person.grade=3,这样没什么作用,只是相当于写了一个函数表达式,不影响这个对象。

第1问:就是执行一个函数表达式,与其他无关,所以是2;

第2问:这里执行了一个函数,但是我们会发现函数声明了一次,函数表达式又写了一次,这时候就涉及到函数声明提升的问题了,当不执行代码的时候就会把函数声明的放到最开始,这时候在后面表达式覆盖了一次,所以就执行了函数表达式的4

第3问:这里首先执行了一个函数,我们会发现这里的getName是全局变量,重新赋值了一次,return中的this是window,就相当于window.getName(),所以执行了覆盖后的getName,结果是1

var a= 1;
function aa(){
    a=10,
    console.info(this)
};
console.info(a); //1
aa(); //window
console.info(a); //10

上面这段小代码更简单的解释了这个关系。 

第4问:和3一模一样

第5问:和第一个一样,只是new了一个对象,

第6问:相当于(new Foo()).getName(),构造函数中的return this;其实就是new出来的对象,所以就是执行对象上的方法,在实例上找不到,就到原型上去找,结果是3

这块也有一个知识点,很容易被忘记,构造函数中没有返回值,实例化后则相当于返回实例化对象,如果返回值是非引用类型,则返回的还是实例化对象;返回值是引用对象则返回那个对象。本题中返回的是this,就是那个实例对象的引用,所以返回实例对象。

第7问:new ((new Foo()).getName)();

 

 

时间: 2024-11-06 07:15:32

this的分析分支的相关文章

Cppcheck代码分析(2)

功能 解析函数中的可能的代码执行流 函数实际执行中只会执行代码流中的一条流 分析: 分支语句 if-else ,switch-case 循环语句 while, do-while ,for 代码流举例 int main(int argc,char ** argv){        std::string p_str= new  std::string() ;         if(std::string == NULL)        {            return 0;         

【CPU微架构设计】利用Verilog设计基于饱和计数器和BTB的分支预测器

在基于流水线(pipeline)的微处理器中,分支预测单元(Branch Predictor Unit)是一个重要的功能部件,它负责收集和分析分支/跳转指令的参数和执行结果,当处理新的分支/跳转指令时,BPU将根据已有的统计结果和当前分支跳转指令的参数,预测其执行结果,为流水线取指提供决策依据,进而提高流水线效率. 下面讨论提出分支预测机制的主要原因和实际意义: 在流水线处理分支跳转指令时,目标地址往往需要推迟到指令的执行阶段才能运算得出,在此之前处理器无法及时得知下一条指令的取指地址,因此无法

数据分析软件

数据分析软件 工欲善其事,必先利其器! 数据分析也好,统计分析也好,数据挖掘也好.商业智能也好都需要在学习的时候掌握各种分析手段和技能,特别是要掌握分析软件工具!我曾经说过,沈老师的学习方法,一般是先学软件开始,再去应用,再学会理论和原理,因为是老师,再去教给别人!没有软件的方法就不去学了,因为学了也不能做,除非你自己会编程序. 那么在数据分析领域,都有哪些软件分析工具呢?如何选择呢?其实很多领域或者说分析方法都有相应的软件工具,只要你想找就应该能够找到! 这里我把软件分成纵横四个层次的的象限图

Dalvik虚拟机的运行过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8914953 在前面一篇文章中,我们分析了Dalvik虚拟机在Zygote进程中的启动过程.Dalvik虚拟机启动完成之后,也就是在各个子模块初始化完成以及加 载了相应的Java核心类库之后,就是可以执行Java代码了.当然,Dalvik虚拟机除了可以执行Java代码之外,还可以执行Native代码,也 就是C和C++代码.在本文中,我们就将继续

超计算(Hyper computation)模型

超计算(Hyper computation)模型 作者:Xyan Xcllet链接:https://www.zhihu.com/question/21579465/answer/106995708来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 超计算,是一个研究比图灵机计算能力更强的计算能力的计算机器的理论计算机科学分支. 主要有以下部分模型: A.谕示机.带"黑箱"的图灵机.由图灵本人亲自提出,"黑箱"就是一个谕示,经过一个谕示就可

git 入门常用命令(转)

Git工作流程:D:\projects\Setup2\Setup2\Setup2\Express\SingleImage\DiskImages\DISK1 git clone工作开始之初,可通过git clone "URL"来实现拷贝远程git仓库并创建本地仓库,再同步工作区代码的效果. git status工作过程中,可随时通过git status查看本地代码与git仓库之间的状态,比如修改.删除.增加的文件状态. git addgit commit若需要将代码向本地仓库递交,则通过

大数据分析学习必须用到的工具,一定要收藏

简单来说,我们可以把大数据分析工具简单分成两个维度: 第一维度:数据存储层--数据报表层--数据分析层--数据展现层 第二维度:用户级--部门级--企业级--BI级 1.数据存储层 数据存储涉及到数据库的概念和数据库语言,这方面不一定要深钻研,但至少要理解数据的存储方式.数据的基本结构和数据类型.SQL查询语言必不可少,精通最好.可从常用的select查询,update修改,delete删除,insert插入的基本结构和读取入手. Access2003. Access07等 ,这是最基本的个人数

Python基础知识进阶(五---2)----程序基本结构、简单分支、异常处理、三大实例分析、基本循环结构、通用循环构造方法、死循环\嵌套循环、布尔表达式

上一篇随笔写的内容有点多了,决定分成两节,不然自己看的时候也头疼. 三者最大实例: 分支结构可以改变程序的控制流,算法不再是单调的一步步顺序执行. 假设:以找出三个数字中最大者的程序设计为例. 输入:三个数值. 处理:三者最大算法 输出:打印最大值 计算机怎么能确定哪个是计算机输入的最大值呢? 策略1:通盘比较 将每个值与其他所有值比较以确定最大值. if x1>=x2 and x1>=x3: max = x1 elif x2>=x1 and x2>= x3: max = x2 e

分支界定法 branch-and-bound 分析与实现)(转载)

1. 介绍分支界定法之前需要了解一下广度优先搜索breadth-First-search(BFS) 1.从图中某个顶点V0出发,并访问此顶点:以层为顺序,一层一层往下遍历 2.从V0出发,访问V0的各个未曾访问的邻接点W1,W2,-,Wk;然后,依次从W1,W2,-,Wk出发访问各自未被访问的邻接点 宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名