basic
- function的实质是对象,函数名只是指向函数对象
- 函数定义:
function fName(param1, param2, …) {
}
var fun1 = function() {}
var showDiv = fun1;
- 另一种定义方式:e.g. var washCar = new Function(carType, carNumber)
- 可以动态生成函数,但不推荐,因为这种生成函数方式会影响性能,浏览器需要解析字符串和解析函数定义代码
- 函数定义在代码执行前就完成了在context中的加载(这个过程叫function declaration hoisting),而函数表达式当运行时才会去进行加载
- 所以函数表达式的一个常见错误是在函数声明前进行调用
- 没有重载,没有函数签名,只是一个函数名而已,重名的函数后者覆盖前者
- 函数可以作为参数值,也可以作为函数返回值
- 作为参数传入时注意,加()是将函数的执行结果传入, 不加()是将函数本身传入
var fun1(){...};
var fun2(b){...};
fun2(fun1);
fun2(fun1());
- 函数参数:
参数为原始数据类型–值传递
参数为对象类型–引用传递 - arguments对象存储了函数的传入参数值
- arguments中有一个对象callee指向拥有arguments的函数,即当前函数(strict mode下禁用)
- arguments.callee.caller 调用当前函数的函数(strict mode下禁用)
对于strict mode还有,全局函数中this指向window对象(strict mode下为undefined) - 通过自我执行来执行匿名函数, 任何匿名函数都是属于window对象
(function(){
console.log(this === window)
})()
var area = new Function("x", "y", "var area ; area = x*y;return area;");
area(2, 3)
$("div").show(500, function () {
$("div").hide();
});
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
var factorial = (function f(num) {
if (num <= 1) {
return 1;
} else {
return num * f(num - 1);
}
});
- 闭包
是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。当一个函数嵌套了另外一个函数,外部函数将嵌套的函数作为返回值。
properties and methods
var car = {color: "red"};
function printColor(car) {
console.log(printColor.length);
}
- apply()
- call(): call(this, arg1, arg2…)
- bind()
var car = {color: "red"};
function washCar(car) {
console.log(this.color || car.color);
}
function applyWashCar(car) {
return washCar.apply(this, arguments);
}
function applyWashCar2(car) {
return washCar.apply(this, [car]);
}
function callWashCar(car) {
return washCar.call(this, car);
}
function bindWashCar(car) {
return washCar.bind(car);
}
applyWashCar(car);
applyWashCar2(car);
callWashCar(car);
bindWashCar(car)();
- 全局函数 Link
- escape() unescape() (deprecated, replaced with encodeURI, encodeURIComponent)
- eval()
eval("({a:1})");
var fun1 = "function a() {}"
var fun2 = "(function a() {})"
var fct1 = eval(fun1)
var fct2 = eval(fun2)
* isFinite()
* isNaN()
* parseFloat()
* parseInt(str, radix)