<!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>
答案 0 :(得分:14)
David Dorward已经提到过JavaScript:Douglas Crockford的好部分。
从那本优秀的书的第4.3节开始:
调用函数暂停 执行当前功能, 将控制和参数传递给 新功能。除了 声明参数,每个函数 接收另外两个参数: 这和争论。这个参数 在面向对象方面非常重要 编程,它的价值在于 由调用模式决定。 有四种调用模式 在JavaScript中:方法调用 模式,函数调用 模式,构造函数调用 模式和应用调用 图案。模式因人而异 这是奖金参数 初始化。
Crockford继续解释每种模式中“this”的绑定,如下所示:
方法调用模式:当函数存储为对象的属性时,我们将其称为方法。调用方法时,它绑定到该对象。
函数调用模式:使用此模式调用函数时,它将绑定到全局对象。这是语言设计中的一个错误。
构造函数调用模式:如果使用新前缀调用函数,则将创建一个新对象,其中隐藏了指向函数原型成员值的链接,这将被绑定到那个新对象。
应用调用模式: apply方法允许我们构造一个用于调用函数的参数数组。它还让我们选择了它的价值。 apply方法有两个参数。第一个是应该绑定的值。第二个是参数数组。
答案 1 :(得分:4)
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();
答案 2 :(得分:1)
除了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
上发表了一篇精彩的演讲答案 3 :(得分:0)
最好查看javascript闭包,了解范围和this指针赋值。 “这个”甚至在面向对象编程之前出现,但绝对是必不可少的。
http://jibbering.com/faq/notes/closures/
这在很大程度上取决于范围链在标识符中的作用 分辨率等等对象上属性名称的解析。
关闭的简单解释是ECMAScript允许内部 功能;函数定义和函数表达式 在其他功能的功能中。
在Variable对象上创建的与之对应的属性 声明的局部变量最初分配了未定义的值 在变量实例化期间,本地的实际初始化 变量直到相应的评估才会发生 在执行函数体代码期间赋值表达式。
事实是Activation对象及其参数 property和Variable对象,其命名属性对应 与函数局部变量,是相同的对象,允许 标识符参数被视为本地函数 变量
最后,为this关键字指定一个值。如果 value赋值是指一个对象,然后是属性访问器的前缀 使用该关键字引用该对象的属性。如果 value(internal)为null,则this关键字将引用 到全球对象。
全局执行上下文的处理稍有不同 它没有参数,所以它不需要定义的激活 反对他们的对象。全局执行上下文确实需要一个 范围及其范围链恰好由一个对象组成,即全局对象 宾语。全局执行上下文确实经历了变量 实例化,其内部函数是正常的顶级函数 构成大量javascript代码的声明。全球 object用作Variable对象,这就是全局声明的原因 函数成为全局对象的属性。和全球一样 声明变量。
全局执行上下文也使用对全局的引用 该对象的对象。 http://jibbering.com/faq/notes/closures/的致密性 章:标识符解析,执行上下文和范围链