2016-11-08 76 views
1

我试过了闭包并发现了意外的行为。有人可以解释为什么这个代码以这种方式工作吗?javascript - 在外部函数中定义的访问属性

function foo() { 
    this.a='hello'; 
    return { 
     aaa:function() { 
     return a; // this suprises me, how can be here accessed 'a' ? 
     } 
    } 
} 

o=foo(); 
alert(o.aaa()); // prints 'hello' ! , I expected undefined 

我不明白,为什么我总是用var that=this句话,如果有可能从内部功能直接访问功能特性。

的jsfiddle https://jsfiddle.net/5co6f707/

+0

'this'并不总是指向同一个对象。这取决于函数如何被调用。写'var that = this'是捕获'this'引用的原始对象的一种方式,以防对象引用稍后改变。 –

+0

'this'关键字与闭包无关吗?如果你已经使用了'var a',它就可以工作。 – Bergi

回答

-1

当执行该代码:

o=foo(); 

foo在全局上下文中执行,因此该行:

this.a='hello'; 

增加a属性全局对象 - window

当你打电话给你aaa功能是这样的:

o.aaa() 

变量a所以它的抬头上了作用域链和它在窗口发现未在函数中定义:

function() { 
    return a; // found on window.a 
} 

window.a返回。

+0

家伙,我不明白为什么这会一再downvoted?你能至少指定一个理由吗? –

5

它显示'hello'因为你在严格模式下是没有,所以this是全球window对象,而不是不确定的,和a成为当值赋给this.a一个全局变量。由于a是一个全局变量,因此无处不在。您可以在脚本的最后加上alert(a);,它也会显示'hello'https://jsfiddle.net/5co6f707/1/

它不应该工作(并且不在严格模式下)并且不应该使用它。如果您打算使用foo作为构造函数,那么在调用它时应该使用new关键字(这会破坏您的代码,但以一种好的方式)。

+0

是的,我在node.js中太长了,所以我忘记了窗口对象现象。 – user2106769