Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以自动将无界函数绑定到与“窗口”不同的对象?_Javascript - Fatal编程技术网

Javascript 是否可以自动将无界函数绑定到与“窗口”不同的对象?

Javascript 是否可以自动将无界函数绑定到与“窗口”不同的对象?,javascript,Javascript,假设我想运行一些Javascript代码,我如何改变它的全局上下文,使其内部定义的无界函数也能绑定到这个新上下文?我目前的想法如下: (function() { var window = {foo: 'bar'}; // just an example (function() { // PUT CODE HERE }).call(window); })(); 这适用于简单的事情。内部函数的上下文和窗口对象都将指向我声明的变量: (function() { var wi

假设我想运行一些Javascript代码,我如何改变它的全局上下文,使其内部定义的无界函数也能绑定到这个新上下文?我目前的想法如下:

(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
获取它),这仍然可以在最内部的函数中获得
窗口