javascript 面向对象基础之一 (创建函数)

在javascript中创建一个函数的方式有两种

//第一种方式

demo(); //可以执行
function demo(){
    alert(1);
}
demo(); //可以执行

//第二种方式

a(); //不能执行,报错
var a = function(){
   alert(1);
}

a(); //可以执行

这两种方式分别通过demo(),a()去执行两个函数,那么这两种方式有区别吗?答案是有区别的。

我们称第二种方式为表达式的方式。

我们发现在执行第一个函数时无论是在函数定义前执行还是在定义后执行都没有问题,而执行第二个函数时则在函数定义前执行是有问题的,其实这不难理解,第二种方式其实就是把一个没有名称的函数(匿名函数)赋值给一个变量a,我们知道在javascript中一个变量只有在声明之后才可以使用。

alert(a) //报错
var a= 1;
//报错
function (){
   alert(1);
}

//不会报错
(function(){
    alert(1);
})

上面我们会发现第一种情况在火狐下会报错,而第二种情况用一个()把它括起来就没有问题,其实浏览器会认为定义一个空函数是没有意义的,但是用一个()括起来浏览器就会把它当作一个表达式来看。

例如:

var a;
//会弹出123,因此会把a=123当作一个表达式进行赋值,然后把赋值后的结果返回回来并打印出来。
alert((a=123));

因此我们可以进一步延伸一下。

var a;

alert(a=function (){
  alert(1);
});

alert((a));

我们发现上面两种情况一样,都是把那个匿名函数体打印出来,既然是返回的是一个函数体,那么我们就可以去执行那个函数体,因此就有了下面的结果

(function (){
  alert(1);
})()

//同样可以传参
(function (name){
   alert(name);
})("zzg")

通过上面的例子我们发现可以把一个函数赋值给一个变量,因此下面也是成立的

//定义一个函数demo
function demo(){
   alert(1);
}

//把demo函数赋值给变量fun
var fun = demo;

//此时fun就是一个函数,我们就可以执行这个函数
//我们可以alert(fun),发现打印出来的就是demo这个函数体
fun(); //打印1

相关推荐