码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript基础之八(functions和闭包)

时间:2015-12-24 19:14:55      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

1.function的调用有四种方式:①普通函数调用  ②作为方法调用(函数作为对象的属性成为方法)  ③构造函数调用  ④call,apply方法来调用

2.this是javascript的关键字,this没有作用域,跟调用的函数有关系,或者在严格模式就行undefined。嵌套的函数this不指向外部函数。如下代码:

    var o = { // 定义了一个对象o
        m: function() { // 给对象m属性添加一个方法
            var self = this; // 保持this指向,这里this指向的是o
            console.log(this); // true
            f(); // 内部调用嵌套的函数
            function f() { // 
                console.log(this===window); // "false"
                console.log(self); // "true"
            }
        }
    };
    o.m();

这里需要注意一个地方,在m的内部调用嵌套函数f(),this指向的是window,并不是o,this只跟调用有关系,这里指向window,表明上看好像是window调用。其实如果改成window.f()来调用,这里会报错window.f not defined,这里需要注意下.

3.arguments.callee:指向当前运行的function,匿名函数需要递归调用时可以使用,在ES5严格模式下不能使用。

    var factorial = function(x) {
        if (x <= 1) return 1;
        return x * arguments.callee(x - 1);
    };
    console.log(factorial(5));//120

4.arguments.caller:这个属性已经废弃,不要再使用了。主要执行调用的函数。

5.闭包:函数对象与函数包含的变量作用域的组合就是闭包。关键词就是函数对象和作用域。从技术讲,所有的javascript函数都是闭包,因为它们是对象而且有作用域。大多数函数调用时使用就是定义时候的作用域链,所以不是很引人注目。闭包在函数嵌套里面开始有点意思,平时基本会忽略,因为函数嵌套产生了不同的作用域。理解闭包一个最基本的原则就是函数在执行的时候使用的是定义时候的作用域链。例如:

    var scope = "global scope"; 
    function checkscope() {
        var scope = "local scope"; 
        function f() {
            return scope;
        } 
        return f;
    }
    console.log(checkscope()());//"local scope"
=====================================================
    var scope = "global scope"; 
    function checkscope() {
        var scope = "local scope"; 
        function f() {
            return scope;
        } 
        return f();
    }
    console.log(checkscope());.//"local scope"

上面两段代码执行的结果都是一样的,说明闭包里面作用域只跟定义的时候有关系,跟在函数里面调用函数还是在函数外面调用函数没有关系。每当我们调用函数时,就会创建一个新的对象来存放一些local的变量,这些变量需要调用时使用的。这个对象(变量绑定的对象)会被添加到作用域链里面,当函数返回时,这个对象就会从作用域链里面移除。如果没有其他引用到这个变量,就会被GC。如果定义了嵌套函数,并且返回一个嵌套函数或者把嵌套的函数存放到一个属性里面。这样就有一个外部的引用。,那么这个嵌套的函数不会被GC,而且对象也不会被GC。

6.闭包的一个例子代码

    var uniqueInteger1 = (function() {
        var counter = 0;
        return function() {
            return counter++;
        };

    }());

    var uniqueInteger2 = (function() {
        var counter = 0;
        return {
            count: function() {
                return counter++;
            },
            reset: function() {
                counter = 0;
            }
        };

    }());

理解闭包基础中的基础就是:词法作用域, 函数调用时候的作用域是使用的该函数定义时候的作用域

7.函数的length属性:表示函数在定义的时候期望的参数个数(就是在括号里面的参数个数)

8.bind方法:把函数绑定到对象,其实就是改变了函数的this指向,bind方法会返回一个新的函数。代码说明如下:

    function f(y, z) {
        console.log(this); //Object {x:1}
        return z ? this.x + y + z : this.x + y;
    }

    var o = {
        x: 1
    };

    var g = f.bind(o, 10);//第一个参数是this指向,后面的参数可选,是给函数赋值的参数。这里给参数y赋值10

    console.log(g());//
    console.log(g(2));//给参数z赋值2
    console.log(g.prototype); //undefined bind返回的函数没有prototype属性

9.函数的定义方式new Function()和function关键字。通过new Function构造的函数不遵循词法作用域,而是全局的。尽量避免使用

    var fn1=new Function(‘x‘,‘y‘,‘return x+y;‘);
    function fn2(x,y){return x+y;}//fn1和fn2等效

    console.log(fn1(1,2));
    console.log(fn2(1,2));

10.高阶(High-Order)函数:把函数作为参数并且返回一个函数。

 

JavaScript基础之八(functions和闭包)

标签:

原文地址:http://www.cnblogs.com/mszhangxuefei/p/js-08.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!