假设我想运行一些Javascript代码,我怎样才能改变它的全局上下文,即使在其中定义的无限制函数也会受到这种新上下文的限制?我目前的想法如下:
(function() {
var window = {foo: 'bar'}; // just an example
(function() {
// PUT CODE HERE
}).call(window);
})();
这适用于简单的事情。内部函数和window
对象的上下文都将指向我声明的变量:
(function() {
var window = {foo: 'bar'}; // just an example
(function() {
// <CODE>
console.log(this, window);
// </CODE>
}).call(window);
})();
输出符合我的预期:Object {foo: "bar"} Object {foo: "bar"}
。
但是当内部代码定义一个函数而没有指定它的this
对象(例如不使用Function.prototype.bind
)时,它会自动将原始window
对象作为this
获取。检查以下代码及其输出:
(function() {
var window = {foo: 'bar'};
(function() {
// <CODE>
console.log(this, window);
(function() {
console.log(this, window);
})();
// </CODE>
}).call(window);
})();
// This code outputs:
Object {foo: "bar"} Object {foo: "bar"}
Window {external: Object, chrome: Object, document: document, configData: Object, speechSynthesis: SpeechSynthesis…} Object {foo: "bar"}
有没有办法真正隔离一段访问原始window
对象的代码?
答案 0 :(得分:2)
如果使用严格模式,则在没有定义上下文(new,bind,call,apply)的情况下调用函数。这将是未定义的,因此它无法修改全局对象窗口。 我建议你阅读mozilla documentation about strict mode。您将在哪里找到以下句子:
这意味着,除其他外,在浏览器中它已不再存在 可以通过严格的内部引用窗口对象 模式功能。
为了说服自己,您可以在浏览器中尝试此代码:
function useStrictMode() {
'use strict';
console.log(this);
}
function noStrict() {
console.log(this);
}
useStrictMode(); //log undefined
noStrict(); //log window
使用严格的&#39;在文件的开头将使您的文件的所有内容使用它。但是如果将js文件与其他文件连接起来可能会有问题。事实上,&#39;使用严格的&#39;可以改变一些代码的组合并打破一些库。这是为什么总是建议将所有代码包装在匿名函数中的原因之一:
(function(){
'use strict';
//your code go here, function declaration here will use strict mode to
})();