最近在学习JS面向对象思想,总结出来了一些方法和技巧,借此分享给大家!
先从最麻烦的this开始!
先定义一个简单函数:
function whoAmI() {
console.log(this.username);
}
将该函数复制成为一个对象的成员方法:
var obj = {
func:whoAmI,
username:'老白'
}
调用该方法:
obj.func(); //老白
由此可见此时this指向的是obj对象。
但是如果直接调用该函数,那结果会是什么呢?
whoAmI(); //undefined
但是如果我们新增一个全局变量,那么结果就会发生改变。
var username = '小郭';
whoAmI(); //小郭
我们都知道,JS中全局变量其实也是window对象的属性。
所以该函数在直接调用的时候,this其实指向的是window对象。
因此就可以得出结论,this的指向并不是在函数定义的时候就决定了的,而是根据函数的调用而动态改变的。
this会指向最终调用该函数的对象
关于this还有一个需要注意的地方,那就是定时器的使用。
setInterval(function(){
console.log(this) //window
},2000);
无论定义在何处,定时器中的函数this都指向window对象。如何解决也是很简单的:
var div = document.getElementById('dv');
div.onclick = function () {
console.log(this); //div
var that = this;
setInterval(function () {
console.log(this); //window
console.log(that); //div
}, 2000);
}
笔记:
function arg(q, c) {
console.log(arguments.length); //3 实参个数
console.log(arguments.callee.length); //2 形参个数
console.log(arguments.callee); //arg 函数本身
}
arg(1, 2,3);
function fun(a,b,c){
arguments[0](5,6);
}
function fun2(d,e,f,g){
console.log(this.length); //4
console.log(this.callee.length); //3
console.log(arguments.length); //2
console.log(arguments.callee.length); //4
}
fun(fun2,7,8,9);
**闭包**
var b = 1; //全局变量
function a() {
b++; //NaN 由于变量生命头发生改变,赋值变为定义
console.log(b);
var b = 1; //‘闭包’改变了变量生命头 变为局部变量
function c() {
b++;
console.log(b);
}
return c;
}
var d = a(); //可变函数 引用传递
d(); //2
d(); //3
d(); //4