<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>
<script type="text/javascript" charset="utf-8">
(function(){
// this
var test=function(){
//this
return function(){
//this
};
}
(function(){
//this
var a={
p1:function(){
//this
}
};
})();
})();
</script>
</body>
</html>
4 回答
David Dorward 已经提到了 Douglas Crockford 的 JavaScript:The Good Parts。
来自那本优秀书籍的第 4.3 节:
调用函数会暂停当前函数的执行,将控制和参数传递给新函数。除了声明的参数外,每个函数还接收两个附加参数:this 和 arguments。this参数在面向对象编程中非常重要,其值由调用模式决定。JavaScript 中有四种调用模式:方法调用模式、函数调用模式、构造函数调用模式和应用调用模式。模式的不同在于如何初始化奖金参数。
Crockford 继续解释每个模式中“this”的绑定,如下所示:
方法调用模式:当函数作为对象的属性存储时,我们称其为方法。当一个方法被调用时, this 被绑定到那个对象。
函数调用模式:当使用此模式调用函数时, this 绑定到全局对象。这是语言设计中的一个错误。
构造函数调用模式:如果使用 new 前缀调用函数,则将创建一个新对象,并带有指向函数原型成员值的隐藏链接,并且 this 将绑定到该新对象。
Apply 调用模式: apply 方法让我们可以构造一个参数数组来调用一个函数。它还允许我们选择 this 的值。apply 方法有两个参数。第一个是应该绑定到 this 的值。第二个是参数数组。
的含义this
取决于包含它的函数是如何被调用的,而不是它是如何构造的。
关于它在 JavaScript 中的工作原理有一个很好的解释:The Good Parts。
简短的版本是,当您将函数 (m) 作为对象 (o) 的方法调用时,this
就是o
.
var o = {
m: function () {
return this;
}
}
var foo = {
bar: o.m;
}
o === o.m();
foo === foo.bar();
除了this
作为评论
在作用域链意义上,它将从this
底部函数一直移动到全局this
。
例如这个在
p1:function(){
//this
}
然后上面的这个
(function(){
//this
var a={
p1:function()
然后this
上面的
(function(){
// this
var test=function(){
雅虎的 Nicholas Zakas 在http://www.youtube.com/watch?v=mHtdZgou0qU上有一个很好的介绍
最好看一下 javascript 闭包,以了解作用域和 this 指针分配。“this”甚至在面向对象编程之前就出现了,但对于它来说绝对是必不可少的。
http://jibbering.com/faq/notes/closures/
这在很大程度上取决于范围链在标识符解析中的作用以及对象上属性名称的解析。
闭包的简单解释是 ECMAScript 允许内部函数;其他函数的函数体内部的函数定义和函数表达式。
在变量对象上创建的与声明的局部变量相对应的属性最初在变量实例化期间被分配未定义的值,局部变量的实际初始化直到在函数体代码执行期间对相应赋值表达式的评估才会发生。
事实上,具有 arguments 属性的 Activation 对象和具有与函数局部变量对应的命名属性的 Variable 对象是同一个对象,这使得标识符参数可以被视为函数局部变量。
最后为 this 关键字分配一个值。如果分配的值引用一个对象,那么以 this 关键字为前缀的属性访问器引用该对象的属性。如果分配的值(内部)为 null,则 this 关键字将引用全局对象。
全局执行上下文的处理方式略有不同,因为它没有参数,因此不需要定义的 Activation 对象来引用它们。全局执行上下文确实需要一个作用域,它的作用域链只包含一个对象,即全局对象。全局执行上下文确实通过变量实例化,它的内部函数是构成大部分 javascript 代码的普通顶级函数声明。全局对象用作变量对象,这就是全局声明的函数成为全局对象属性的原因。与全局声明的变量一样。
全局执行上下文还使用对 this 对象的全局对象的引用。由http://jibbering.com/faq/notes/closures/ 章节提供:标识符解析、执行上下文和范围链