JavaScript函数笔记-函数定义的三种方式

函数定义的三种方式:
一、 函数声明

function add(i,j){
return i+j;
}

函数声明的特点:
1)函数定义会被前置;
2)重复定义函数时,最后一次函数定义有效。

二、函数表达式

var add=function(i,j){
return i+j;
} 

三、函数实例化

var add=new Function("i","j","return(i+j)");
add(2,3);

函数实例化特点:定义的函数只能访问本地作用域和全局作用域。

函数声明的特点:
1、函数调用可以在函数定义之前执行,函数定义前置到顶部
函数表达式:
函数调用在函数定义之前报错,函数未定义。(但用Firebug调试执行正常,可能因为Firebug修改过底层)

add(1,2);
function add(i,j){
return i+j;
}//3

add(1,2);
var add=function(i,j){
return i+j;
} //add is not a function(…) 

函数声明为什么可以在函数定义之前调用函数呢?
函数执行的顺序:

add(1);
function add(i){
console.log(i+1);
}
var add2=function(i){
console.log(i+2);
add2(1);
var add3=new function("i")
add3(1);

实际执行顺序:
函数声明:函数定义会前置到顶部。
函数表达式和函数实例化定义的函数:变量声明前置到顶部,变量赋值还在原位置。

var add2;
var add3;
function add(i){console.log(i+1);}
add(1);
add2=function(i){console.log(i+2);}
add2(1);
add3=new function("i")
add3(1);

2、函数声明:重复定义函数时,函数声明执行最后一次定义的函数。
函数表达式和函数实例化重复定义不影响。

 function add1(i){
   console.log("函数声明:"+(i+1));
 }
add1(1);//11

 var add2 = function(i){
   console.log("函数表达式:"+(i+2));
 }
  add2(1);//3

 var add2 = function(i){
   console.log("函数表达式:"+(i+20));
 }
 add2(1);//21

 function add1(i){
   console.log("函数声明:"+(i+10));
 }
add1(1);//11

 var add3 = new Function("i","console.log('函数实例化:'+(i+3));");
 add3(1);//4
 var add3 = new Function("i","console.log('函数实例化:'+(i+30));");
 add3(1);//31

如果几种定义函数的方式一起重复定义某函数,函数如何执行呢?


function add1(i){
   console.log("函数声明:"+(i+1));
 }
add1(1);

 var add1 = function(i){
   console.log("函数表达式:"+(i+2));
 }
add1(1);
 function add1(i){
   console.log("函数声明:"+(i+10));
 }
add1(1);

执行结果:
函数声明:11
函数表达式:3
16 函数表达式:3

为什么是这样呢?根据上面提到的函数声明的特点来分析一下。
首先,函数预执行之前,函数声明的函数定义前置到顶部。上面的代码真正的执行顺序是:

var add1;
 function add1(i){
   console.log("函数声明:"+(i+1));
 }
 function add1(i){
   console.log("函数声明:"+(i+10));
 }
 add1(1);//11。执行的是上面的函数
 add1 = function(i){
   console.log("函数表达式:"+(i+2));
 }
add1(1);//3
add1(1);//3

函数实例化定义函数的特点:
定义的函数只能访问本地作用域和全局作用域。

var person = {name:"刘德华", age:50};
(function(){
  var person = {name:"刘德华", age:30};
  var func = new Function("var person = {name:'刘德华', age:10};\
    console.log(person.name+person.age+'岁');");
  func();
})();\\刘德华10岁。“\”何解?

var person = {name:”刘德华”, age:50};
(function(){
var person = {name:”刘德华”, age:30};
var func = new Function(“console.log(person.name+person.age+’岁’);”);
func();
})();//刘德华50岁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值