Javascript 是否可以自动将无界函数绑定到与“窗口”不同的对象?
假设我想运行一些Javascript代码,我如何改变它的全局上下文,使其内部定义的无界函数也能绑定到这个新上下文?我目前的想法如下:Javascript 是否可以自动将无界函数绑定到与“窗口”不同的对象?,javascript,Javascript,假设我想运行一些Javascript代码,我如何改变它的全局上下文,使其内部定义的无界函数也能绑定到这个新上下文?我目前的想法如下: (function() { var window = {foo: 'bar'}; // just an example (function() { // PUT CODE HERE }).call(window); })(); 这适用于简单的事情。内部函数的上下文和窗口对象都将指向我声明的变量: (function() { var wi
(function() {
var window = {foo: 'bar'}; // just an example
(function() {
// PUT CODE HERE
}).call(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
),它会自动将原始窗口
对象作为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"}
有没有一种方法可以真正隔离一段代码,从而访问原始的
窗口对象?如果使用严格模式,在没有定义上下文(新建、绑定、调用、应用)的情况下调用函数。这将是未定义的,因此无法修改全局对象窗口。
我劝你读书。你可以在这里找到以下句子:
这意味着,在浏览器中,它不再是
可以在严格的
模式功能
为了说服自己,您可以在浏览器中尝试以下代码:
function useStrictMode() {
'use strict';
console.log(this);
}
function noStrict() {
console.log(this);
}
useStrictMode(); //log undefined
noStrict(); //log window
在文件开头加上“use strict”将使文件的所有内容都使用它。但是,如果您将js文件与其他文件合并,则可能会出现问题。事实上,“use strict”可以更改某些代码的组成并破坏某些库。这就是为什么总是建议将所有代码包装在匿名函数中的原因之一:
(function(){
'use strict';
//your code go here, function declaration here will use strict mode to
})();
具体来说,添加“使用严格”代码>作为第一个函数中的第一行。这样做会产生以下输出:Object{foo:bar}Object{foo:bar}
未定义对象{foo:“bar”}
@RaulFernandez'use strict'
应该在函数中,这样它就不会影响全局范围。全局使用严格模式可能会导致第三方代码出现问题。@MatthewHerbst:理想情况下,每种代码都符合严格模式:-)@Bergi true,但我更希望运行在信任他人之上的网页相信我们的理想:d“有没有一种方法可以真正隔离一段代码以访问原始窗口对象?”可以使用var global=Function('returnthis')()访问窗口代码>@YuryTarabanko,应该是答案(即“否”)。即使将此处的外部函数置于严格模式(这会阻止最内部的this
获取它),这仍然可以在最内部的函数中获得窗口
。