JavaScript设计模式的作用是提高代码的重用性,可读性,使代码更容易的维护和扩展
在javascript中,函数是一类对象,这表示他可以作为参数传递给其他函数;此外,函数还可以提供作用域。
创建函数的语法
命名函数表达式
//命名函数表达式var add = function add(a,b){ return a+b;};var foo = function bar() { console.log(foo === bar);};foo();//true
可见,他们引用的是同一函数,但这只在函数体内有效。
var foo = function bar() {};console.log(foo === bar);//ReferenceError: bar is not defined
但是,你不能通过调用bar()来调用该函数。
var foo = (function bar() { console.log(foo === bar);})();//false
函数表达式
//又名匿名函数var add = function(a,b){ return a+b;};
为变量 add 赋的值是函数定义本身。这样,add 就成了一个函数,可以在任何地方调用。
函数的声明
function foo(){ //code here} //这里可以不需要分号
在尾随的分号中,函数表达式应总是使用分号,而函数的声明中并不需要分号结尾。
声明式函数与函数表达式的区别在于:在JS的预编译期,声明式函数将会先被提取出来,然后才按顺序执行js代码:
console.log(f1);//[Function: f1]
console.log(f2);//undefined,Javascript并非完全的按顺序解释执行,而是在解释之前会对Javascript进行一次“预编译”,在预编译的过程中,会把定义式的函数优先执行
function f1(){ console.log("I am f1");}var f2 = function (){ console.log("I am f2");};
由于声明函数都会在全局作用域构造时候完成,因此声明函数都是window对象的属性,这就说明为什么我们不管在哪里声明函数,声明函数最终都是属于window对象的原因了。
在javascript语言里任何匿名函数都是属于window对象。在定义匿名函数时候它会返回自己的内存地址,如果此时有个变量接收了这个内存地址,那么匿名函数就能在程序里被使用了,因为匿名函数也是在全局执行环境构造时候定义和赋值,所以匿名函数的this指向也是window对象
var f2 = function (){ console.log("I am f2");};console.log(f2());//I am f2(function(){ console.log(this === window);//true})();
函数声明与表达式
函数的提升(hoisting)
函数声明的行为并不等同于命名函数表达式,其区别在于提升(hoisting)行为,看下面例子:
<script type="text/javascript"> //全局函数 function foo(){alert("global foo!");} function bar(){alert('global bar');} function hoist(){ console.log(typeof foo);//function console.log(typeof bar);//undefined foo();//local foo! bar();//TypeError: 'undefined' is not a function //变量foo以及实现者被提升 function foo(){ alert('local foo!'); } //仅变量bar被提升,函数实现部分 并未被提升 var bar = function(){ alert('local bar!'); }; } hoist(); </script>
新闻热点
疑难解答
图片精选