函数
函数如果没有返回值,会默认返回undefined,
通过new调用函数构造器,如果没有返回对象类型,将会默认返回this。
函数声明
function命令
foo();//函数前置 function foo(){}
函数表达式
foo();//TypeError: foo is not a function var foo=function(){}
立即调用的函数表达式(IIFE)
function(){...}();// SyntaxError: Unexpected token ( //Javascript引擎看到function关键字之后,认为后面跟的是函数定义语句,不应该以圆括号结尾。 (function(){ /* code */ })(); var i = function(){ return 10; }(); !function(){ /* code */ }(); /* 通常情况下,只对匿名函数使用这种“立即执行的函数表达式”。它的目的有两个:一是不必为函数命名,避免了污染全局变量;二是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。 */
Function构造函数
var add = new Function("x","y","return (x+y)"); // 相当于定义了如下函数 // function add(x, y) { // return (x+y); // }
函数属性、arguments
function foo(x,y,z){ arguments.length===2; arguments[0]=10//形参x在非严格模式下为10 arguments[2]=100//z依然是undefined arguments.callee===foo; } foo(1,2); foo.length;//3 形参个数 foo.name;//"foo" foo.toString(();//输出函数内容
闭包
一般情况下,函数调用完成后。函数中的局部变量就可以被释放掉。
阮一峰:闭包就是能够读取其它函数内部变量的函数
function outer() { var localVal = 30; return function() { return localVal; } } var func = outer(); func(); // 30
常见错误
1 document.body.innerHTML = "<div id=div1>aaa</div>" 2 + "<div id=div2>bbb</div><div id=div3>ccc</div>"; 3 4 for (var i = 1; i < 4; i++) { 5 document.getElementById('div' + i). 6 addEventListener('click', function() { 7 alert(i); // all are 4! 8 }); 9 } 10 11 for (var i = 1; i < 4; i++) { 12 !function(i) { 13 document.getElementById('div' + i). 14 addEventListener('click', function() { 15 alert(i); // 1, 2, 3 16 }); 17 }(i); 18 }
浙公网安备 33010602011771号