为什么未定义此变量的值

时间:2016-05-15 05:29:12

标签: javascript

我目前正在学习javascript并遇到了这个例子

var t = function()
{
  this.name = "Jam";
  no = "123";
}

console.log(t.no); //Undefined 
var m = new t();
console.log(m.name);

为什么第一个语句未定义?

4 个答案:

答案 0 :(得分:5)

t是一个函数对象。与任何其他对象一样,该函数可以分配属性。因此,为了使您的代码正常工作,您应将"123"分配给函数的no属性(A行):

var t = function()
{
  this.name = "Jam";
}
t.no = "123"; // line A

console.log(t.no); // "123"
var m = new t();
console.log(m.name);

答案 1 :(得分:2)

  

为什么第一个语句未定义?

因为t没有属性no

首先,代码函数内,即

this.name = "Jam";
no = "123";

仅在函数调用时执行。您使用var m = new t();执行此操作, console.log(t.no);

其次,no = "123"; 在函数对象上创建属性。它将尝试设置变量no的值。由于变量在您的示例中不存在,因此该行将创建全局变量 no,如果您的代码位于strict mode,则会引发错误。< / p>

考虑以下示例:

var no = 21;
function foo() {
  no = 42;
}
console.log(no); // 21
foo();
console.log(no); // 42

答案 2 :(得分:1)

因为t是一个函数,它将由t();执行。另一方面,no是一个全局scooed变量,从任何地方都没有前缀。

答案 3 :(得分:1)

t是一个函数表达式。您可以访问像t().no这样的函数的返回对象,或者您可以通过将该函数用作此类构造函数来创建新对象

myT = new t()
console.log(t.no);

但是你的no变量只是函数内部的一个全局变量,它不是它返回的部分,也不是附加到构造函数的返回对象。

Here是一个非常好的教程,涵盖了所有这些主题。