首页 > Web开发 > 详细

JS函数和声明提升

时间:2021-03-11 22:21:51      阅读:29      评论:0      收藏:0      [点我收藏+]

函数的定义与调用

语法:

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是没有块级作用域。

技术分享图片

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

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

技术分享图片

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

技术分享图片

看几个例子:

技术分享图片

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

技术分享图片

再看一个例子:

技术分享图片

函数提升

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

技术分享图片

输出结果:

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

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

技术分享图片

输出结果:

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

最后一个例子

技术分享图片

输出结果:

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

总结:

  • 1、所有的声明都会提升到作用域最顶上去。
  • 2、同一个变量只会声明一次,其他的会被忽略掉。
  • 3、函数声明的优先级高于变量声明,并且函数声明和函数定义部分一起被提升。

JS函数和声明提升

原文:https://www.cnblogs.com/ChiRou/p/14520789.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!