Loading

JS函数和声明提升

函数的定义与调用

语法:

function 函数名(形参1,形参2,...){
    代码块;
    return 返回值;
};

匿名函数:

var f1 = function(形参1,形参2,...){
    代码块;
    return 返回值;
}
f1(1,2)

立即执行函数:

(function(a, b){
    return a + b;
})(1, 2);

函数中的arguments参数

在函数体内通过arguments对象来访问参数数组,从而获取传给函数的每个参数。可以通过索引取到参数。

function add(a,b){
  console.log(a+b);
  console.log(arguments.length)
}

add(1,2)

3
2

注意:函数只能返回一个值,如果要返回多个值,要放在数组中或对象中。

函数的全局变量和局部变量

  • 局部变量:在JS函数内部声明的变量(使用var)是局部变量,所以只能在函数内部访问它,该变量的作用域是函数内部。函数执行完毕,局部变量就会被删除。
  • 全局变量:在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。

变量生存周期

JS变量的生命期从他们被声明的时间开始,局部变量会在函数运行完毕后删除,全局变量会在页面关闭后删除。

作用域

函数的作用域关系在定义阶段就以确定,与调用位置无关。

首先在函数内部查找变量,未找到则到外层函数查找,逐步找到最外层。

var city = "BeiJing";
function f() {
  var city = "ShangHai";
  function inner(){
    var city = "ShenZhen";
    console.log(city);  // 局部存在则在局部查找
  }
  inner();
}
var city = "BeiJing";
function Bar() {
  console.log(city);
}
function f() {
  var city = "ShangHai";  // 在局部定义的变量,并非修改全局的变量
  return Bar;
}
var ret = f();
ret();
var city = "BeiJing";
function f(){
    var city = "ShangHai";
    function inner(){
        console.log(city);  // 局部存在则在局部查找
    }
    return inner;
}
var res = f();
res(); 

JS中的变量提升和函数提升

在ES6之前,js是没有块级作用域。

img

在JS中,代码的执行是分两步走的,1、解析。2、一步一步执行。

变量提升就是变量声明会被提升到作用域的最顶上去,也就是该变量无论是在作用域的哪个地方声明的,都会提升到作用域的最顶上去。

img

上面这种写法其实等价于下面这种写法:

img

看几个例子:

img

把上面的例子稍作改动,结果就会大不一样,

img

再看一个例子:

img

函数提升

函数声明式,会将函数的声明和定义一起提升到作用域的最顶上去。

img

输出结果:

生命不息 奋斗不止
ƒ fn(){
    console.log('生命不息 奋斗不止');
}
生命不息 奋斗不止

如果是这种写法:函数表达式声明的函数

img

输出结果:

ƒ fn(){
    console.log('生命不息 奋斗不止');
}
ƒ fn(){
    console.log('生命不息 奋斗不止');
} 

最后一个例子

img

输出结果:

ƒ fn(){
    console.log('生命不息 奋斗不止');
}
hello

总结:

  • 1、所有的声明都会提升到作用域最顶上去。
  • 2、同一个变量只会声明一次,其他的会被忽略掉。
  • 3、函数声明的优先级高于变量声明,并且函数声明和函数定义部分一起被提升。
posted @ 2021-03-11 21:45  吃了好多肉  阅读(172)  评论(0编辑  收藏  举报