函数调用
函数声明与调用
我们可以通过如下定义函数,使用fun()来调用
-
fun(); // 调用函数 函数定义可以在下面
-
function fun() {
-
(3);
-
}
也可以用var来定义,此时应先声明后使用
-
var fn = function() {
-
console.log(4);
-
}
-
fn(); // 调用函数 必须先声明后使用
匿名函数
-
(function(x, y){
-
alert(x + y);
-
})(2, 3);
这里创建了一个匿名函数(在第一个括号内),第二个括号(2, 3)用于调用该匿名函数,并传入参数。括号是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行.
错误1
function(){ /* code */ }(); // SyntaxError: Unexpected token (
在js解析时,当遇到function关键字时,会默认把它当做是一个函数声明,而不是函数表达式,函数声明需要一个函数名,而上面的代码中函数没有函数名。(以上代码,也正是在执行到第一个左括号(时报错,因为(前理论上是应该有个函数名的。)
错误2
function foo(){ /* code */ }(); // SyntaxError: Unexpected token )
相当于先声明了一个叫foo的函数,之后进行()内的表达式运算,但是()(分组操作符)内的表达式不能为空,所以报错。(以上代码,也就是执行到右括号时,发现表达式为空,所以报错)。
(function {// code})是表达式, function {// code}是函数声明
立即执行函数
(function(){ /* code */ })();
当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行。也可以表示为如下形式
var i = function(){ return 10; }();
闭包
变量的作用域分全局变量和局部变量,局部变量仅在函数内部使用
闭包的核心就是内部函数可以引用外部函数的参数和变量,通过返回函数来扩大函数的作用域,如下定义outFun函数,在里面定义了inFun函数,inFun可以调用outFun中定义的num变量,return inFun返回了内部函数体,
-
function outFun() {
-
var num = 10;
-
function inFun() {
-
console.log(num); // 非常正常的写法
-
}
-
return inFun; // 返回的是 inFun函数体 核心
-
}
使用时,通过var demo = outFun();
调用outFun函数返回inFun的函数体,相当于这句话 var demo = function inFun() {(num); }
在通过demo();
调用,此时访问到了内部的num变量。
闭包可以让一个变量长期驻扎在内存中,避免全局变量的污染
-
var res = (function() {
-
var count = 29;
-
return function add() {
-
count++;
-
(count);
-
}
-
})();
-
res(); //30
-
res(); //31
闭包传递参数
定义函数如下,定义obj变量时,传入参数,当obj()调用时,输出传入的参数。
-
function Fun(x) {
-
return function() {
-
(x);
-
}
-
}
-
var obj = Fun(4);
-
// 相当于 obj = function() {(4)}
-
obj(); //执行 (4)
定义函数如下,定义obj时传入初始x值,obj();执行时,y参数为空,输出NaN,obj(2);执行时,输出6
-
function Fun(x) {
-
return function(y) {
-
(x+y);
-
}
-
}
-
var obj = Fun(4);
-
// 相当于 obj = function(y) {(4+y)}
-
obj(); //NaN
-
obj(2); //6
事件传递参数
我们将onclick事件绑定到函数体,调用move函数
-
btn1.onclick = function() {
-
move(5);
-
}
-
btn2.onclick = function() {
-
move(-5);
-
}
-
function move(speed) {
-
.left = + speed + "px";
-
}
通过闭包可以直接返回函数体并传递参数
-
function move(speed) {
-
return function() {
-
.left = + speed + "px";
-
}
-
}
-
btn1.onclick = move(5);
-
btn2.onclick = move(-5);
匿名函数创建闭包
-
var oEvent = {};
-
(function(){
-
var addEvent = function(){ /*代码的实现*/ };
-
function removeEvent(){}
-
-
= addEvent;
-
= removeEvent;
-
})();