prototype属性
每一个函数都包含prototype属性,这个属性是指向一个对象的引用,当将函数用作构造函数的时候,新创建的对象会从原型对象上继承属性
call和apply方法
以对象a的方法调用函数f()
f.call(a);
3
f为函数,a为对象
泛函
我感觉有必要复习一下下数学
指定义域为函数,而值域为实数的函数,这样的函数为泛函
至此结束,用js写一下泛函,这也是其函数式编程的基础
function m() {
return 2;
}
function f(m) {
var f1 = m;
f1 = function() {
return m.call();
}
return f1;
}
定义了两个函数,执行一下,第二个函数是将第一个,传入进入的函数
f.apply(m);
function f1()
输入为函数,输出为函数
bind方法
加里化,将多个参数的函数变换成接受一个单一参数的函数
ps 由逻辑学家 哈斯凯尔·加里命名
bind方法,将函数绑定至某个对象,当在函数f()上调用bind方法,并传入一个对象o作为方法,,这个方法将会返回一个新的函数,,将会以函数调用的方式,调用新的函数将会把原始函数f()当做o的方法调用。传入函数的任何实参都会传入新的函数
g = f.bind(o)
等价于
g = o.f
外加参数
g(x) = o.f(x)
function f(y,z) {
return this.x + y + z;
};
f.x = 3;
var g = f.bind(f, 3);
好啦,这样就完成了一次加里化
如果不使用this仍可以使用
function f(y,z, e) {
return y + z + e;
};
var g = f.bind(null, 3, 2);
运行一下
g(3);
8
toString方法
返回源码, 过
Function构造函数
var f = new Function('x', 'y', 'return x + y');
undefined
f;
function anonymous()
f(3,2);
5
function()函数创建的是一个匿名函数
Function()构造函数运行js在运行时动态的创建并编译函数
每次调用Function()构造函数都会解析函数体,并创建新的函数对象,如果在一个循环或者多次调用的函数中执行并构造这个函数则执行效率会受影响
Function()构造函数所创建的不是使用词法作用域,相反,函数体代码的编译会在顶层函数执行。
ps,需要注意最后一点,Function()函数体代码是在顶层函数执行的
可调用的对象
类数组对象不是真正的数组,
var a = {};
for (var i = 0; i<10; i++) {
a[i] = i*i;
}
以上生成的数组为类数组对象