【笔记】 《js权威指南》- 第8章 函数 - 8.7 函数属性、方法和构造函数

1.函数的length属性:

表示函数期望的实参个数

function check(args) {
    console.log(args.lenght, args.callee.length);
}

function f(x, y, z) {
    check(arguments);
    return x + y + z;
}
//2, 3
console.log(f(1, 2));

2.call() apply():

间接调用函数,可以看做是某个对象的一个方法,第一个参数表示要调用方法的对象

在call函数中,调用方法的参数作为第一个参数之后的参数;

在apply函数中,调用方法的参数放入一个数组中作为其第二个参数;

f.call(o, 1, 2);
f.apply(o, [1, 2]);

3.bind()方法:

将函数绑定到一个对象中,作为该对象的方法调用,bind返回新函数。

ECMAS5:

第一个参数表示要绑定的对象,将被绑定的对象中的this值设置为对象中的this值,后面的参数固定被绑定的函数传入的实参值。

function f(y, z) {return this.x + y + z};
var g = f.bind({x: 1}, 2);
g(3);
//x = 1, y = 2, z = 3
ECMAS3模拟版本:

if (!Function.prototype.bind) {
    Function.prototype.bind = function(o /* , args */) {
        var self = this, boundArgs = arguments;
        return function() {
            var args = [], i;
            for(i = 1; i < boundArgs.length; i++) args.push(boundArgs[i]);
            for(i = 0; i < arguments.length; i++) args.push(arguments[i]);
            return self.apply(o, args);
        };
    };
}

4.isFunction():

function isFunction(x) {
    return Object.prototype.toString.call(x) === "[object Function]";
}

5.构造函数:

注意:使用此方法构造的函数并不使用此法作用域,其编译总是会在全局作用域执行。

var f = new Function("x", "y", "return x * y;");
//等价
var f = function(x, y) {return x * y;};




你可能感兴趣的:(函数,call,apply,bind,isFunction)