Javascr ipt中this指向问题
记得初学 Javascr ipt 时,其中 this 的指向问题曾让我头疼不已,我还曾私自将其与闭包、原型(原型链)并称 JS 武林中的三大魔头。如果你要想在 JS 武林中称霸一方,必须将这三大魔头击倒。个人认为在这三大魔头中,this 指向问题的武功最菜(难度最低)。俗话说柿子捡软的捏,那我们就先从 this 指向问题下手。
先记住攻克 this 指向问题的口诀(前辈们的总结):哪个对象调用函数,函数里的 this 就默认指向哪个对象(注意 this
关于闭包的解释
我们将作用域链描述为一个对象列表,不是绑定的栈。每次调用javascr ipt函数的时候,都会为之创建一个新的对象来保存变量,把这个对象添那个加至作用域中,当函数返回时,就从作用域链中将这个绑定变量的对象删除,如果不存在嵌套函数,也没有其他引用指向这个绑定的对象,它就会被当垃圾回收掉,
(function () {
var val = null;
var callback;
setTimeout(function () {
val = 1;
callback(v
Javascr ipt的作用域以函数为界,不同的函数拥有相对独立的作用域。函数内部可以声明和访问全局变量,也可以声明局部变量(使用var关键字,函数的参数也是局部变量),但函数外部无法访问内部的局部变量:
function test() {
var a = 0; // 局部变量
b = 1; // 全局变量
}
a = ?, b = ? // a为undefined,b为1
同名的局部变量会覆盖全局变量,但本质上它们是两个独立的变量,一方发生变化不会影响另一方:
a = 5; // 函
【嵌套函数】 Javascr ipt允许嵌入的函数,允许函数用作数据,并且在函数词法作用域下面,可以产生与传统面向对象语言不同的惊人地方。 首先,Javascr ipt的函数是通过词法来划分作用域的,而不是动态的划分作用域的,于是,函数的是在定义它们的作用域中运行,而不是在执行它们的作用域中运行,所以,当嵌套函数和它的外围函数定义在同一个词法作用域中的时候,是很容易理解的。比如下面很平淡无奇的代码: 代码如下: var x = ‘global’; function f () { var
感叹是为了缓解严肃的气氛并引出今天要讲的话题,”javascr ipt面向对象编程”,接下来,我们围绕面向对象的几大关键字:封装,继承,多态,展开。 封装:javascr ipt中创建对象的模式中,个人认为通过闭包才算的上是真正意义上的封装,所以首先我们先来简单介绍一下闭包,看下面这个例子: 代码如下: [removed] function myInfo(){ var name =”老鱼”,age =27; var myInfo = “my name is” + name + “i am” +
代码如下: function f1(){ var n = 999; nAdd = function(){ n += 1; } function f2(){ alert(n); } return f2; } 这里的闭包是f1,封闭了一个变量n和一个函数f2。 我们先无视nAdd,尽量保持原貌重写一下这个函数。 代码如下: function f1(){ var n = 999; var f2 = function(){ alert(n); }; return f2; } var result =
感叹是为了缓解严肃的气氛并引出今天要讲的话题,”javascr ipt面向对象编程”,接下来,我们围绕面向对象的几大关键字:封装,继承,多态,展开。 封装:javascr ipt中创建对象的模式中,个人认为通过闭包才算的上是真正意义上的封装,所以首先我们先来简单介绍一下闭包,看下面这个例子: 代码如下: [removed]// <![CDATA[ function myInfo(){ var name =”老鱼”,age =27; var myInfo = “my name is” +