我目前正在学习javascript并遇到了这个例子
var t = function()
{
this.name = "Jam";
no = "123";
}
console.log(t.no); //Undefined
var m = new t();
console.log(m.name);
为什么第一个语句未定义?
答案 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是一个非常好的教程,涵盖了所有这些主题。