2013-03-11 70 views
0

如果我没有错,在严格模式下,函数不能访问全局对象(函数'this'未定义)。另一方面,内部函数需要访问父项的“this”来关闭工作。在严格模式下,JavaScript是否为内部函数创建了一个例外?ES5的“使用严格”;影响关闭?

+0

请显示一些示例代码,解释_exactly_您所指的设置。 – 2013-03-11 04:08:58

+0

如果该函数未作为实例的方法调用,则在严格模式下这是未定义的。 – kennebec 2013-03-11 04:38:15

回答

3

闭合指针与this指针无关。闭包是函数式编程而不是面向对象编程的概念。 this指针是面向对象编程的一个概念。两者都可以同时独立工作而不会造成问题。

例如,考虑在严格的模式有以下功能:

function getCounter() { 
    "use strict"; 

    var count = 0; 

    return function counter() { 
     return ++count; 
    }; 
} 

这里的getCounter一个调用返回关闭。功能counter关闭count。然后你可以使用返回的计数器,如下所示:

var counter = getCounter(); 

counter(); // 1 
counter(); // 2 
counter(); // 3 

我觉得你把关闭与嵌套函数混淆。阅读以下主题。它解释了关闭真的很好:JavaScript closures vs. anonymous functions

在严格模式下,this指针为undefined,它指向全局对象。否则,您可以正常使用它。这可以防止您意外创建全局变量。但它不会造成任何障碍。

例如,考虑下面的构造函数:

function Counter() { 
    "use strict"; 

    var count = 0; 

    this.increment = function() { 
     count++; 
    }; 

    this.getCount = function() { 
     return count; 
    }; 
} 

您可以创建一个实例,按如下方式使用它:

var counter = new Counter; 
counter.increment(); 
counter.getCount();  // 1 

但是如果你忘了把new然后this将指向严格模式下的全局对象是undefined。因此,试图将方法increment分配到this将引发错误。

回到原始问题,如果您想在嵌套函数中访问它,可以始终将this指针的值存储在另一个变量中。例如:

function Counter() { 
    "use strict"; 

    var that = this; 

    that.count = 0; 

    return function counter() { 
     return ++that.count; 
    }; 
} 

我知道,这是一个非常愚蠢的例子,但它有所有了解我的点所需要的元素。您现在可以使用上述功能,如下所示:

var counter = new Counter; 

counter(); // 1 
counter(); // 2 
counter(); // 3 

这就是它的全部。

+0

谢谢Aadit。这种混淆是由于对封闭和词汇范围之间的关系缺乏了解。以为通过'this'访问全局/父变量,而不是通过词法范围。 – 2013-03-11 07:57:20

2

通过你的问题,我相信你的意思是构造函数和实例化对象。 use strict编译指示不影响它。在表达式中通过点或方括号表达式访问和调用类型函数的对象属性会自动将ThisBinding设置为从中获得函数引用的对象。

function Foo() {} 
Foo.prototype.someMethod = function() { 
    console.log(this.blah); 
}; 
var foo = new Foo(); 
foo.blah = 1; 

//this: 
foo.someMethod(); 
//implicitly does this: 
foo.someMethod.call(foo); 

Fiddle

TJ可能已经在Mythical Methods解释方式简单此行为:

[...]当你调用一个函数使用会从功能参考的表达式一个对象属性(例如,object.functionName()object['functionName']()),该对象在函数调用中自动设置为“this”。


use strict仅使(nullundefined)当this结合没有被设置的差,这是不这里的情况。

然后,你知道,当进入功能代码时,在非严格模式this引用未设置它指的是全局对象(window对象在浏览器环境中),而在严格的模式下,它是undefined。见ES5.1 Section 10.4.3


现在,如果你的意思是封闭在另一个里面的函数,使用旧的词汇范围伎俩。

function outerFunction() { 
    var _this = this; 
    function innerFunction() { 
     // _this references the outerFunction's this 
    } 
} 

此行为不受use strict的影响。

+0

谢谢Fabricio。正如另一条评论所提到的,混淆是由于对封闭和词汇范围之间的关系缺乏了解。以为通过'this'访问全局/父变量,而不是通过词法范围。 – 2013-03-11 07:57:54