函数声明之function与var

纸上得来终觉浅,绝知此事要躬行。

软件这行业,很多东西还是要靠敲代码敲出来的,你以为看书看的很通透,例子也能做出来的东西,一需要深入混合运用顿时觉得懵逼了。关键还是在于一知半解,不够深入。

今天我就总结一下近段时间遇到并纠结过的一些知识。

老规矩,由浅入深,用发散性思维思考每个知识点。

一、声明一个函数 function与var

1.function

aaa();    //先调用
function aaa(){    //后声明
    //code
}  

js是按顺序执行,但是这里却可以先调用再声明

其原因是,js解析器都是先找到function声明,然后再开始上下文执行,

所以函数已经提前被声明,只是我们代码顺序显示在后

要点,此时需要声明与调用在同一作用域(作用域不同时请看后文)

2.var

var aaa = function(){    //先声明
    //code    //后调用
};  

这里就是通常的解析过程,当解析器开始执行上下文之前,aaa是undefind(并未声明),

只有上下文执行到var aaa = function。。。这句话时,aaa才被声明并且当场赋值

例子1:

function something() {
  return ‘hello‘;
}  

alert(something());  //??这里会返回什么  

function something() {
  return ‘world‘;
}  

分析一下,首先js解析器会先找到functioin声明,然后根据js特性后面会覆盖前面,

再执行上下文,所以这里会输出    world

例子2:

var something = function() {
  return ‘hello‘;
}  

alert(something());  //??这里会返回什么  

function something() {
  return ‘world‘;
} 

分析过程:

1.找到function声明,function something(){}

2.执行上下文,var something;

3.执行上下文,赋值给something,成功覆盖前面的something

4.输出    hello

剩下一些var function的位置自行脑补然后按以上思路解决,

记住,虽然内部解析有这样的小差别,但是在外部看是一样的,如果你用typeof测试something(),两种返回的都是function

然后我们再往深入思考,要是function声明时,与调用不在一个作用域时,what happened?

这种情况只要抓住一条重点,看作用域链

例子3:

var scope = "global";
function f( ) {
    console.log(scope);
}
var a = function(){
    f();
};
a(); 

顺着作用链,f先被声明,然后执行上下文,scope赋值,接着执行函数a,a调用已声明函数f,

f调用同一作用域链的外部变量scope,所以输出    global

例子4:

var ga = ‘global‘;
var func = function() {
  var la = ‘local‘;
 return function() {
    return function()
    {
      return function()
      {
        alert(la);alert(ga);
      }
    }
 }  

}
a = func()()()();  

根据作用域链,层层调用,所以输出

local

global

然后就在弄清这些知识点时,我又发现另一个不曾注意的新知识点:

变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的

请看一下两段代码:

var scope="global";
function f(){
    console.log(scope);
    var scope="local";
    console.log(scope);
}
f(); 

输出:

undefind

local

第一段代码比第二段多了一个var,结果大大不同

简单点理解,就是上面讲解var的时候,解析器先把var声明成undefind

所以第一段代码可以写为

var scope="global";
function f(){
    var scope;
    console.log(scope);
    scope="local";
    console.log(scope);
}
f(); 
时间: 2024-11-02 13:31:14

函数声明之function与var的相关文章

js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别

js中有两种声明函数的方法,分别为: var functionOne = function() { // Some code }; function functionTwo() { // Some code } 为什么会有两种不同的方法?每个方法的优点和缺点分别是什么?有什么情况是一种方法能完成而另外一种方法不能完成的吗? 答: by @Greg 不同点在于functionOne只会在到达赋值的那一行才会被真正定义,而functionTwo会在 包含它的函数或script脚本 执行的时候马上被定

函数声明与函数表达式的区别

1.函数声明 函数声明以function关键字开头,接着是必须的函数(变量)名和以逗号分隔的可选的参数列表,再接着就是以大括号封装的函数体.函数声明必须是一个单独的JavaScript语句. 2.函数表达式 在任何情况下都是其它JavaScript语句的一部分(比如复制表达式等号的右侧.函数的参数)的函数被称为函数表达式. 3.比较 //函数声明function myFunctionDeclaration(){ function innerFunction() {} } //以下为函数表达式 v

函数声明与函数表达式

1.什么是函数声明,函数表达式 函数声明:function 函数名(){} 函数表达式:function 函数名(){}.函数名可写可不写.写出来的,就是命名函数表达式,不写的就是匿名函数表达式 例子: function aaa(){};这就是函数声明 var a=function aaa(){};命名函数表达式 var a=function(){};匿名函数表达式 下面的都是函数表达式 (function aaa(){}) ~function aaa(){} -function aaa(){}

函数声明

语法 function name([param,[, param,[..., param]]]) { [statements] } name 函数名 param 传递非函数的参数名,参数个数最多255个. statements 构成函数体的语句. 描述 通过函数声明构造的函数是Function对象,所以拥有一切Function对象所有的属性,方法和行为. 函数默认返回undefined,如果想返回其他值,函数必须使用return语句来返回你想返回的值. 通过条件语句判断创造的函数 函数可以通过条

[Effective JavaScript 笔记]第15条:当心局部块函数声明笨拙的作用域

嵌套函数声明.没有标准的方法在局部块里声明函数,但可以在另一个函数的顶部嵌套函数声明. function f(){return "global"} function test(x){ var result=[]; function f(){return "local";}//block-local if(x){ result.push(f()); } result.push(f()); return result; } test(true);//["loc

Javascript进阶(6)---函数声明

------------- JS中的函数也是一种对象 函数的返回值是return来决定的,没有则返回undefined 1.函数声明法 function add(a, b) { a = a + a; b = b + b; } 2.函数表达式法 var add = function (a , b){ ......}; (function(){......}()); return function (){......} var add =function foo(a,b){......}; //命名

函数声明、函数表达式、匿名函数

函数声明.函数表达式.匿名函数 ()先碰到了(),然后碰到function关键字就会自动将()里面的代码识别为函数表达式而不是函数声明 函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式. 匿名函数:function ()

js中函数声明与表达式

//函数声明:function 函数名(){} //函数表达式: function 函数名(可写可不写的)(){}  : 命名函数表达式 匿名函数表达式 //function aaa(){} : 函数声明 //var a = function aaa(){} : 命名函数表达式 //var a = function(){}  : 匿名函数表达式 (function aaa(){}) : 表达式 ~function aaa(){} -function aaa(){} +function aaa()

JavaScript笔记- 函数声明和函数表达式(001)

function 是 Javascript 中的第一类对象,这就意味着函数可以像其他值一样被传递.一个最常见的用法就是将一个匿名函数作为回调函数传递到另外一个异步函数中. 函数声明 ? 1 function foo() {} 函数 foo 将会在整个程序执行前被 hoist (提升),因此它在定义 foo 函数的整个 scope (作用域)中都是可用的.即使在函数定义之前调用它也没问题. 1 2 foo(); // Works because foo was created before thi