为什么嵌套函数中的上下文“this”会发生变化?

时间:2015-08-11 08:12:23

标签: javascript javascript-objects

我有一个基本的基本问题。我执行以下代码。

var app = {
  x: 10,

  start: function() {
    window.setTimeout(this.callback.bind(this), 10);
  },

  callback: function() {

    function print() {
      console.log('p '+ this.x);
    }

    console.log('c '+ this.x);
    print();

  }
};

app.start();

您可以在jsbin

上执行此代码

我希望它输出c 10p 10。而是输出c 10p undefined。在进一步检查时,this内的print()似乎指向window对象。为什么会发生这种情况?

3 个答案:

答案 0 :(得分:0)

因为当您调用print时,您没有使用任何上下文,因此打印内的this是指窗口对象。

您可以使用print之类的

将自定义上下文传递给.call()



var app = {
  x: 10,

  start: function() {
    window.setTimeout(this.callback.bind(this), 10);
  },

  callback: function() {

    function print() {
      snippet.log('p ' + this.x);
    }

    snippet.log('c ' + this.x);
    print.call(this);

  }
};

app.start();

<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您被声明为对象内的全局函数。你可以改为:

CourierId

Jsfiddle工作:http://jsfiddle.net/rsf6gmr2/

答案 2 :(得分:-2)

您需要使用bindprint()功能,以使其有效。

function print() {
    console.log('p '+ this.x);
}.bind(this)

因为没有它,每个函数都有自己的this对象链接到窗口。