-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
由一个简单的问题重新思考this的引用问题 #19
Comments
obj.y作为函数的返回值返回(第一个括号),再调用(第二个括号),obj.y函数作为函数的返回值。
将函数作为值赋值给变量c,再执行。
这个主要是和上面对比,但是不知道前者结果为何是2,后者好理解。 |
最终的问题是:
|
在作业上看到,提供一下自己的看法,不知道能不能帮到您。
以上就很好理解了
以上可以看到后面的可以看成一个函数表达式,解析器解析的时候会知道这是一个函数表达式的执行。
如有错误,烦请指正 |
@Chenjiayuan195 var x = 1;
var obj = {
x: 2,
y: function(){
console.log(this.x);
}
}
var obj2 = {
x: 3,
z: function(){
console.log(this.x);
console.log((function(){return obj.y})()());
}
}
obj2.z(); // 3 1 后者如果依照我的解释,那么匿名函数执行完后,返回的那个函数所处的执行环境应当是obj2,但是结果依然是window。这也就说明了你解释的正确性。 总结说来,其实(一个函数)()这种形式无论前者嵌套了多少层,函数中的this一定是window 2、第二段代码的解释我还是有点疑惑的: 我理解的是(obj.y)是一个表达式,输出结果是一个函数,然后再将其执行,这样既然在全局环境下执行,就应当指向的是全局环境(后来,我把这段代码也写在了obj2的z函数中,结果依然显示的是obj的x值,所以我这种想法其实是错误的),但是我不知道我错在了哪里? |
是的,有一句话有助于理解这个现象,this的指向取决于执行的时候谁调用它。
obj.y取的是function的地址,而且解析器解析(obj.y)是一个函数表达式,且立即执行了这个函数,此时函数的执行环境就是obj的环境,再结合上面的一句话this的指向取决于执行的时候谁调用它,很显然是obj调用了它并且立即执行,所以就是指向了obj的变量。
显而易见了,这首先是一个赋值的操作,此时的object.name赋给它一个function,而不是它去调用,所以指向window, 而上面第二个是去直接调用,所以指向自身,希望能够解释清楚。 |
我也写了一篇相关的文章 http://chenjy195.sc2yun.com/2018/05/26/ 望赏脸 =。= |
@Chenjiayuan195 |
刚才,群里有一位同学提出这样一个问题:
这个问题其实是考查的是js的
异步执行
的问题,不深入的去解释的话,js高程(p203)对超时调用的函数特别强调:因此,就认定this指向的是window,因此结果是1,当然正确结果也是1。
这里obj.y不是调用关系,而是赋值,传递给超时函数作为形参。
最开始我却认为这和异步执行没关系,即使直接不用超时函数,
obj.y();
,这个结果应该也是1(最简单的js代码,啪啪打脸),而且有理有据,obj.y仅仅只是一个函数的名称而已,而且在全局作用域下执行的,因此结果应当是1,甚至群里许多人都被我带偏了,认为我说的对。但是其实不然,我也不知道为什么我这个解释为什么错了(哈哈哈),
obj.y();
这个非常常规的对象函数调用结果是2。首先,函数执行的this值,是指向函数据以执行的环境对象(js高程p114),但是如何确定是哪个环境对象呢?
由此,进一步我提出了下面问题,怎么解释下面4段代码:
The text was updated successfully, but these errors were encountered: