是否有可能自动将无界函数绑定到与`window`不同的东西?

时间:2016-04-15 09:37:12

标签: javascript

假设我想运行一些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对象的代码?

1 个答案:

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