首页 > 语言 > JavaScript > 正文

JavaScript 函数模式详解及示例

2024-05-06 14:52:01
字体:
来源:转载
供稿:网友

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>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选