javascript对象中的变量和函数作用域

时间:2016-02-20 05:27:53

标签: javascript node.js scope

我正在尝试建立一个超级原始线索函数。基本上需要多次重复操作。

var serialCue = {
  init:function(length_of_cue, handler){
    this.length_of_cue = length_of_cue;
    this.handler = handler;
    //this.handler();
    var index = 0;
  },
  monitor: function(){
    console.log(this.index);
    // this.handler();
    // this.index++;
    // if(this.index>=this.length_of_cue){
    //   this.handler();
    // }
  },
  eachIteration: function(callback){
    console.log("yo");
    callback();
  },
  startProcessing: function(){
    for(var count=0;count<this.length_of_cue;count++){
      this.eachIteration(this.monitor);
    }
  }
}

module.exports = Object.create(serialCue);

//IN APP.JS
var cue = require('./serial_cue.js');

cue.init(5,function(){
  console.log("done done and done!");
});

cue.startProcessing();

输出返回&#34;未定义&#34;对于索引的值。我想弄清楚为什么&#34;这个&#34;除了monitor之外,在为该对象定义的所有方法中都可预测。 JS中的范围仍然有些不稳定。

1 个答案:

答案 0 :(得分:2)

当您将某个函数称为functionName()时,而不是某个对象的方法,例如object.functionName(),其this值将在严格模式下默认为undefined,和&#34;草率模式中的全局对象&#34;。

这里有两个选项:

在将函数传递给方法之前将函数绑定到this

this.eachIteration(this.monitor.bind(this));

或者,如果您希望eachIteration中的回调始终将当前this作为其this值,则可以使用回调&#39; .call()方法:

callback.call(this);

<小时/> 另一个问题是indexinit方法中的局部变量,只要init()完成执行,它就会消失。如果您希望对象具有index属性,请将其设为属性:

var serialCue = {
    index: 0,
    init:function(length_of_cue, handler){
.....