Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ';这';函数中的关键字_Javascript_Function_Object_This - Fatal编程技术网

Javascript ';这';函数中的关键字

Javascript ';这';函数中的关键字,javascript,function,object,this,Javascript,Function,Object,This,摘自ejohn.org: function katana(){ this.isSharp = true; } katana(); assert( isSharp === true, "A global object now exists with that name and value." ); 事实证明这是真的 有人能解释一下吗? 在函数中,我们看到this.isSharp=true,它不是创建了一个object的函数,它应该具有属性isSharp,其值将是true?(我认为对

摘自ejohn.org:

function katana(){ 
  this.isSharp = true; 
} 
katana(); 
assert( isSharp === true, "A global object now exists with that name and value." ); 
事实证明这是真的

有人能解释一下吗? 在函数中,我们看到
this.isSharp=true
,它不是创建了一个
object
的函数,它应该具有属性
isSharp
,其值将是
true
?(我认为对象是katana,因为它调用函数,所以
katana.isSharp
应该是
true
)。 换句话说,
这个
到底指的是什么


为什么
isSharp
被创建为对象?

您不使用
new
,因此
是函数中的全局对象(
窗口

katana();
真是

window.katana(); // the passed context is window
这就是为什么断言
isSharp===true
,它实际上测试
window.isSharp
,返回
true


如果要创建
katana
的新实例,请使用
new katana()
,然后
this
将成为函数中的新实例,保持
窗口。isSharp
不变。

这在JavaScript中确实不可靠

是根据函数调用周围的上下文而不是函数的属性来确定的。如果函数是这样调用的:

f()
foo.f()
new f()
然后
将引用全局对象。如您所见,向全局对象添加属性等同于添加全局变量。如果函数是这样调用的:

f()
foo.f()
new f()
然后
将引用
foo
。例如:

> function printx() { console.log(this.x); }
> x = 300
> obj1 = {x: 20, printx: printx};
> obj2 = {x: 50, printx: printx};
> printx();
300
> obj1.printx();
20
> obj2.printx();
50
最后,如果像这样调用函数:

f()
foo.f()
new f()
然后创建一个新对象,
this
引用该新对象,表达式
new f()
计算结果要么是该新对象,要么是由
f()
返回的对象,如果
f()
返回一个对象

都在规格里,很奇怪

这不是创建了一个对象,它应该具有isSharp属性,并且它的值应该是真的吗

否,因为函数未作为构造函数调用。如果您有
var obj=new katana()
,那么您将得到一个具有
isSharp
属性的对象。否则,它只是一个函数调用,那么这应该是什么呢?JavaScript不知道,所以它决定它是未定义的,并返回到全局对象(除非处于严格模式)

在JavaScript中确定函数中的
this
的值可能会令人困惑,因为它是动态确定的,具体取决于函数的调用方式。基本规则是,
将是全局对象,除非:

  • 函数被称为对象方法(那么这就是对象),或者
  • 该函数以构造函数的形式调用,并使用新操作符(在这种情况下,它将指向正在构造的新对象)

有关此调用的对象上下文的更多详细信息

在您的例子中,它是
window.katana()

所以
这个
指的是
窗口

这里可能指的是窗口