gpt4 book ai didi

javascript - 是否可以自动将无界函数绑定(bind)到不同于 `window` 的东西?

转载 作者:行者123 更新时间:2023-11-29 14:42:44 25 4
gpt4 key购买 nike

假设我想运行一些 Javascript 代码,我怎样才能改变它的全局上下文,即使在它内部定义的无界函数也能绑定(bind)到这个新上下文?我目前的想法是:

(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 对象的代码?

最佳答案

如果您使用严格模式,当您的函数在没有定义的上下文(new、bind、call、apply)的情况下被调用时。这将是未定义的,因此它不能修改全局对象窗口。我建议你阅读 mozilla documentation about strict mode .在哪里可以找到以下句子:

That means, among other things, that in browsers it's no longer possible to reference the window object through this inside a strict mode function.

为了说服自己,您可以在浏览器中尝试这段代码:

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
})();

关于javascript - 是否可以自动将无界函数绑定(bind)到不同于 `window` 的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36643512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com