进阶-函数
-
函数的定义
-
函数声明
函数定义会被前置
重复定义函数时,最后一次定义有效
//可以在创建前被调用
function add(i, j) {
return i + j;
} -
函数表达式
//不可以在创建前被调用 var add = function (i, j) { return i + j; };
-
函数实例化
定义的函数只能访问本地作用域和全局作用域
//不可以在创建前被调用
var add = new Function("i", "j", "return (i + j)");
-
-
函数调用
-
函数调用模式
this指向全局对象 -
方法调用模式
this指向调用者 -
构造函数调用模式
this指向被构造的对象 -
apply(call)调用模式
this指向第一个参数
-
-
函数传参
-
原始类型按值传递
-
对象类型按共享传递
-
- 闭包
-
保存函数运行状态
/**
* 闭包使用举例1
* 将字符串中的一些特定字符按顺序用数组中的元素替换,例如:
* var arr = ['c','f','h','o'];
* var str = 'ab4de8g4ijklmn7';
* 替换后 str == 'abcdefghijklmno';
* replace的用法请参考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace
**/
var arr = ['c','f','h','o'];
var str = 'ab4de8g4ijklmn1';
console.log(str);
var func = (function(){
// count变量会保存在闭包作用域内,表示func被调用次数(即正在替换第几个字符)
var count = 0;
return function(){
return arr[count++];
}
})();
str = str.replace(/\d/g, func)
console.log(str); // => "abcdefghijklmno" -
封装
/**
闭包使用举例2 -- 封装
1.暴露type类型和start, stop, getStatus方法
2.隐藏status,light对象状态
**/
var Car = function(type){
var status = "stop",
light = "off";
return {
type: type,
start: function(){
status = "driving";
light = "on";
},
stop: function(){
status = "stop";
light = "off";
},
getStatus: function(){
console.log(type + " is " + status + " with light " + light);
}
}
}
var audi = new Car("audi");
audi.start();
audi.getStatus(); // => "audi is driving with light on"
audi.stop();
audi.getStatus(); // => "audi is stop with light off" -
性能优化
/**
闭包使用举例3 -- 性能优化1
减少函数定义时间和内存消耗
**/
// 不使用闭包
function sum(i, j) {
var add = function(i, j){
return i+j;
}
return add(i, j)
}
var startTime = new Date();
for(var i = 0; i< 1000000; i++) {
sum(1,1);
}
var endTime = new Date();
console.log(endTime - startTime); // => 66// 使用闭包 var sum = (function() { var add = function(i, j){ return i+j; } return function(i,j) { add(i, j); } var startTime = new Date(); for(var i = 0; i< 1000000; i++) { sum(1,1); } var endTime = new Date(); console.log(endTime - startTime); // => 8
-