大家都应该知道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、函数的预解释是在就近的作用域(母体)内,最后语句解释也是在就近的作用域内