zoukankan      html  css  js  c++  java
  • Javascript进阶必会

    概念:

    局部块函数声明:

    ES5才承认有这个东西。

    function f(){return 'global';}
    
    function test(x){
        var result = [];
        if(x) {
            function f(){return "local";}
            result.push(f());
        }
        result.push(f());
    }
    test(true);
    test(false);

    虽然,Javascript是不存在块级作用域的,但是
    这个输出仍然是不能确定的,并不是所有的Javascript环境会输出
    [local local]和[local]。

    为了避免这种情况,还是把局部块或者 嵌套子语句中。
    如果确实要 根据条件确定函数,那么可以用var变量声明和 函数表达式来实现。

    全局作用域和调用接收者:

    var obj = {
        hello: function (){
            return "hello, "+ this.username;
        },
        username:"A";
    };
    var obj2 = {
        hello:obj.hello,
        username:"B";
    };
    obj2.hello();//hello, B

    obj2调用的方法是 obj中的hello函数,但是接收者是obj2,obj2被绑定到this变量。

    但是ES5的严格模式 把this变量的默认值绑定值设为undefined.

    function hello(){
    “use strict”;
    return “hello, “+ this.username;
    }

    hello();//error: 不能读取undefined的username属性。

    方法调用把方法所属的对象 作为调用接收者。
    函数调用将全局对象(严格模式为undefined)作为调用接收者。

    call指定调用接收者

    函数对象的call方法可以用来调用其自身:

    f.call(obj, arg1, arg2, arg3)等同于 obj.f(arg1, arg2, arg3)

    例如 某个{} 的hasOwnProperty如果被删除
    dict.foo = 1;
    delete dict.hasOwnProperty

    仍然可以用 {}.hasOwnProperty.call(dict, “foo”) //true
    {}.hasOwnProperty.call(dict, “hasOwnProperty”) //false

    apply 使用多个参数来调用函数

    func1 = function (){…}

    func1.apply(null, list);
    如果func1没有使用this.

    如果使用了,例如
    buffer.append.apply(buffer, list);第一个参数用来指定接收者。

    arguments变量隐式被保存到函数内

    注意arguments处于嵌套的函数时,要用变量去读取。

    bind

    obj.forEach(obj2.add);
    提取了obj.add但是接收者是 obj。

    forEach的实现默认把全局对象作为了接收者。

    obj.forEach(obj2.add, obj2)

    假如forEach不支持指定接收者怎么办?
    obj.forEach(function (s){
    obj2.add(s);
    obj2.join();
    …..
    }, obj2)

    直接指定目标数组。

    ES5直接支持这种做法:

    obj.forEach(obj2.add.bind(obj2))
    但bind不改变原来的函数调用接收者,而是新生成一个函数。
    obj2.add === obj2.add.bind(obj2) //false
    因此bind方法是安全的。

    bind实现函数柯里化

    function simpleURL(protocol, domain, path){
    return protocol + “://”+domain+ “/” + path;
    }
    paths.map(simpleURL.bind(null, “http”, siteDomain));
    将函数与其参数的一个子集进行绑定的技术成为函数柯里化。(currying,Haskell Curry)

  • 相关阅读:
    css3与gpu加速
    前端集成解决方案小结
    body内html标签的选用
    在win8下快速搭建angularjs测试环境以及可能遇到的问题
    javascript快速排序
    Sublime Text2配置python环境
    python学习第一天
    开机自检
    各种排序算法及c语言实现
    算法表示
  • 原文地址:https://www.cnblogs.com/slankka/p/9158497.html
Copyright © 2011-2022 走看看