函数,匿名函数新认知(与预解释、作用域的关系)

大家都应该知道j函数的2中写法:

1 //函数声明
2 function fun () {
3     return true;
4 }
5 //匿名函数 or 函数表达式 or 函数变量化
6 var var2fun = function () {
7 return false;
8 }

可以这样(函数变量化)大概是因为:js是弱类型语言,定义变量的时候只有一个var,为变量赋值时会自动判断类型并进行转换。     (提出一个问题!javascript在 var 时候做了什么!)

这里我们主要关注一下他们的区别吧!

大家都知道javascript是解释性语言。以语句块和语句行的形式边读取边执行,虽然没有编译整个过程,但会有预解析(这个过程会在作用域内,把函数、变量前置)

 预解释前置    (输出代码为追加的测试代码)

var var2fun ;    //预解析后  变量前置   具体的函数实现还是在相应位置的语句块
//一般函数
function fun() {
    return true;
}

console.log(fun);//-->function fun() { return true;}
console.log(var2fun);//--> undefined
console.log(fun());//-->true
console.log(var2fun());//--> 报错了

//函数变量化 
var2fun = function () { 
  returnfalse; 
}

函数的 预解释和闭包的关系

大家知道函数预解释会前置,但是前置式有影响范围的,前置只是在最接近的母体(作用域)里面前置。不会前置到母体的母体

function fun1() {
    return true;
}

//函数变量化
(function() {
   
    console.log("1"+fun1()); //->false  fun1在这个函数母体内(预编译前置)后返回false
    function fun1 () {
        return false;
    }
    console.log("2"+fun1());  //->false 不用多说
})()

console.log("4"+fun1());   //->true 在上母体是(闭包)环境   本作用域不受到影响   即返回true

匿名函数的 预解释和闭包的关系

上代码和结果

var fun1 = function() {
    return true;
}

//函数变量化
;(function () {
   console.log("1"+fun1); //->undefined  fun1在这个函数母体内(预编译前置)   会把 var fun1; 前置到闭包的前面,但是没有赋值、也不会影响外部函数fun1
   console.log("1"+fun1()); //->error  fun1 is not a function    虽然前置了
   var fun1 = function () {
        return false;
    }
    console.log("2"+fun1());  //->false 不用多说
})()

console.log("4"+fun1());   //->true   在上母体是(闭包)环境 

 

语言表达水平匮乏啊!~

不知道大家明白了没

简单总结起来就是

1、js预编译时候  会先定义变量,再预定义函数

2、变量只做声明,不初始化;初始化在初始化语句执行时候。这个同时也适用于匿名函数的变量化。变量化的匿名函数会先声明,不会初始化

3、函数的预解释是在就近的作用域(母体)内,最后语句解释也是在就近的作用域内

posted @ 2015-12-26 19:43  benny.liu  阅读(258)  评论(0编辑  收藏  举报