ES5是否“严格使用”;影响关闭?

时间:2013-03-11 04:06:50

标签: javascript closures

如果我没有错,在严格模式下,函数无法访问全局对象(函数的'this'未定义)。另一方面,内部函数需要访问其父级的'this'才能使闭包工作。 JavaScript是否在严格模式下对内部函数进行了异常处理?

2 个答案:

答案 0 :(得分: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

这就是它的全部内容。

答案 1 :(得分:2)

根据您的问题,我相信您的意思是构造函数和实例化对象。 use strict pragma不会影响它。通过表达式中的点或方括号表示法访问和调用对象的类型函数属性会自动将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仅在未设置this绑定(nullundefined)时才会有所作为,而这不是这种情况。

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


现在,如果你的意思是在另一个函数内部的闭包,请使用旧的词法范围技巧。

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

此行为也不受use strict的影响。