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));
间接调用函数,可以看做是某个对象的一个方法,第一个参数表示要调用方法的对象
在call函数中,调用方法的参数作为第一个参数之后的参数;
在apply函数中,调用方法的参数放入一个数组中作为其第二个参数;
f.call(o, 1, 2); f.apply(o, [1, 2]);
将函数绑定到一个对象中,作为该对象的方法调用,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 = 3ECMAS3模拟版本:
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); }; }; }
function isFunction(x) { return Object.prototype.toString.call(x) === "[object Function]"; }
注意:使用此方法构造的函数并不使用此法作用域,其编译总是会在全局作用域执行。
var f = new Function("x", "y", "return x * y;"); //等价 var f = function(x, y) {return x * y;};