在Javascript中使用带有“apply”的局部变量

时间:2014-02-08 18:36:12

标签: javascript variables inheritance scope apply

为什么“show”方法无法在此处访问“text”变量?

// @constructor A
var A = function(){

    //alerts some text variable
    this.show = function(){
       alert("Hello")
       alert(text);
  }

}

//@constructor B
var B = function(){

  //local text variable
  var text = "World";
  A.apply(this); // "show" method will get attached to B
}

var obj = new B();

//now calling show of B's object.
obj.show(); //returns error.



//Expected output
alerts "Hello"
alerts "World"

//Actual output
alerts "Hello" 
ReferenceError: text is not defined

我在这里遗漏了什么吗? B的“show”方法不应该可以访问“text”变量吗?

2 个答案:

答案 0 :(得分:1)

与C ++或Java不同,Javascript没有隐式this

如果函数(如show)引用this.foo,则只有this的值取决于函数的调用方式。

但是,如果show直接引用变量(如foo),那么它可能意味着:

  • 一个局部变量,如果它是在函数范围内使用var定义的;
  • 来自闭包的变量,如果函数正在另一个函数中定义,恰好用var定义它(闭包在函数定义时创建),
  • 否则为全局变量。

在您的情况下,第三种情况适用。 show无法访问text,因为它是在完全不相关的范围内定义的。

答案 1 :(得分:0)

您需要将text声明为B构造函数this.text = "World";的属性。

var A = function(){

    //alerts some text variable
    this.show = function(){
       alert("Hello")
       alert(this.text);
  }

}

//@constructor B
var B = function(){

  //local text variable
   this.text = "World";
  A.apply(this); // "show" method will get attached to B
}

var obj = new B();

//now calling show of B's object.
obj.show(); //returns error.