如果我没记错的话,在严格模式下,函数无法访问全局对象(函数未定义“this”)。另一方面,内部函数需要访问其父级的“this”才能使闭包起作用。JavaScript 会在严格模式下对内部函数进行异常处理吗?
2 回答
this
闭包与指针无关。闭包是函数式编程的概念,而不是面向对象的编程。this
指针是面向对象编程的一个概念。两者都可以同时独立工作而不会引起问题。
例如,在严格模式下考虑以下函数:
function getCounter() {
"use strict";
var count = 0;
return function counter() {
return ++count;
};
}
这里调用getCounter
返回一个闭包。该函数counter
关闭value count
。然后,您可以按如下方式使用返回的计数器:
var counter = getCounter();
counter(); // 1
counter(); // 2
counter(); // 3
我认为您将闭包与嵌套函数混淆了。阅读以下主题。它很好地解释了闭包:JavaScript 闭包与匿名函数
在严格模式下,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
thenthis
将指向严格模式下的全局对象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
这就是它的全部。
通过您的问题,我相信您的意思是构造函数和实例对象。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);
TJ 可能在Mythical Methods中以更简单的方式解释了这种行为:
object.functionName()
[...] 当您使用从对象属性(例如,或)获取函数引用的表达式调用函数时object['functionName']()
,该对象在函数调用中自动设置为“this”。
use strict
仅当this
未设置绑定(null
或undefined
)时才会有所不同,此处并非如此。
那么如你所知,this
当输入函数代码时没有设置引用时,在非严格模式下它是指全局对象(window
浏览器环境中的对象),而在严格模式下它是undefined
. 见ES5.1 第 10.4.3 节
现在,如果您的意思是将闭包作为另一个函数内部的函数,请使用旧的词法范围技巧。
function outerFunction() {
var _this = this;
function innerFunction() {
// _this references the outerFunction's this
}
}
这种行为不受use strict
两者的影响。