如果我没有错,在严格模式下,函数不能访问全局对象(函数'this'未定义)。另一方面,内部函数需要访问父项的“this”来关闭工作。在严格模式下,JavaScript是否为内部函数创建了一个例外?ES5的“使用严格”;影响关闭?
回答
闭合指针与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
这就是它的全部。
谢谢Aadit。这种混淆是由于对封闭和词汇范围之间的关系缺乏了解。以为通过'this'访问全局/父变量,而不是通过词法范围。 – 2013-03-11 07:57:20
通过你的问题,我相信你的意思是构造函数和实例化对象。 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);
TJ可能已经在Mythical Methods解释方式简单此行为:
[...]当你调用一个函数使用会从功能参考的表达式一个对象属性(例如,
object.functionName()
或object['functionName']()
),该对象在函数调用中自动设置为“this”。
use strict
仅使(null
或undefined
)当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
的影响。
谢谢Fabricio。正如另一条评论所提到的,混淆是由于对封闭和词汇范围之间的关系缺乏了解。以为通过'this'访问全局/父变量,而不是通过词法范围。 – 2013-03-11 07:57:54
- 1. 随着XHTML严格的边界影响的背景颜色
- 2. 使用严格MeteorJS
- 3. 无法关闭MAMP中的严格标准警告
- 4. 如何打开/关闭localhost(xampp)中的MySQL严格模式?
- 5. 关闭描述符是否影响创建的守护进程
- 6. 什么是不关闭InputStreamReader的负面影响
- 7. 在关闭OutputStreamWriter之后试图终止程序的影响
- 8. 将ImeMode设置为关闭的负面影响
- 9. 如何在Rails 3.2.x中关闭MySQL严格模式
- 10. 无法关闭严格标准警告,XAMMP,PHP 5.4.7
- 11. 如何在严格模式下实现以下JavaScript关闭?
- 12. ASP.NET XHTML严格验证和自动完成=关闭
- 13. xml:lang&lang属性如何影响XHTML严格1.0页面的呈现?
- 14. 关闭菜单/格关闭
- 15. 在javascript中使用“严格”
- 16. angularjs严格使用plunker
- 17. PHP 7:同时使用严格和非严格类型提示?
- 18. 为什么关闭Zend社区版Optimizer +对此没有影响?
- 19. ASP.NET:Javascript关闭时会受到什么影响?
- 20. 什么导致SplashScreen关闭,我可以影响这
- 21. OSGI相关影响调查
- 22. 使表格无法关闭
- 23. CodeIgniter .htaccess影响表格
- 24. 风格影响Drupal桌子
- 25. 使用magic_quotes()会影响mysql_real_escape_string()的使用
- 26. 响应格,而不影响中心DIV
- 27. 自动关闭不使用表格?
- 28. 关闭提示,使用表格或div?
- 29. 闭合如何影响for循环?
- 30. JavaScript'严格使用';里面的函数
请显示一些示例代码,解释_exactly_您所指的设置。 – 2013-03-11 04:08:58
如果该函数未作为实例的方法调用,则在严格模式下这是未定义的。 – kennebec 2013-03-11 04:38:15