JS面向对象编程(一) 搞懂this的指向!

最近在学习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

你可能感兴趣的:(JS)