首页 web前端 js教程 js中变量声明以及函数声明提升的详细解析(附示例)

js中变量声明以及函数声明提升的详细解析(附示例)

Aug 23, 2018 pm 02:16 PM
函数声明 变量声明

本篇文章给大家带来的内容是关于js中变量声明以及函数声明提升的详细解析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

变量声明提升
1、变量定义
可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined。

2、变量作用域
变量作用域指变量起作用的范围。变量分为全局变量和局部变量。全局变量在全局都拥有定义;而局部变量只能在函数内有效。  
在函数体内,同名的局部变量或者参数的优先级会高于全局变量。也就是说,如果函数内存在和全局变量同名的局部变量或者参数,那么全局变量将会被局部变量覆盖。  
所有不使用var定义的变量都视为全局变量

3、函数作用域和声明提前
JavaScript的函数作用是指在函数内声明的所有变量在函数体内始终是有定义的,也就是说变量在声明之前已经可用,所有这特性称为声明提前(hoisting),即JavaScript函数里的所有声明(只是声明,但不涉及赋值)都被提前到函数体的顶部,而变量赋值操作留在原来的位置。如下面例子:  
注释:声明提前是在JavaScript引擎的预编译时进行,是在代码开始运行之前。

var scope = 'global';function f(){
    console.log(scope);    
    var scope = 'local';
    console.log(scope);
}
登录后复制

由于函数内声明提升,所以上面的代码实际上是这样的

var scope = 'global';function f(){
    var scope;    //变量声明提升到函数顶部
    console.log(scope);
    scope = 'local';    //变量初始化依然保留在原来的位置
    console.log(scope);
}
登录后复制

经过这样变形之后,答案就就非常明显了。由于scope在第一个console.log(scope)语句之前就已经定义了,但是并没有赋值,因此此时scope的指是undefined.第二个console.log(scope)语句之前,scope已经完成赋值为’local’,所以输出的结果是local。

函数声明提升
函数声明语法

f('superman');function f(name){
    console.log(name);
}
登录后复制

函数表达式语法

f('superman');var f= function(name){
    console.log(name);
}
登录后复制

运行上面的代码,会报错Uncaught ReferenceError: f is not defined(…),错误信息显示说f没有被定义。
为什么同样的代码,函数声明和函数表达式存在着差异呢?
这是因为,函数声明有一个非常重要的特征:函数声明提升,函数声明语句将会被提升到外部脚本或者外部函数作用域的顶部(是不是跟变量提升非常类似)。正是因为这个特征,所以可以把函数声明放在调用它的语句后面。如下面例子,最终的输出结果应该是什么?:

var getName = function(){
    console.log(2);
}function getName (){
    console.log(1);
}
getName();
登录后复制

可能会有人觉得最后输出的结果是1。让我们来分析一下,这个例子涉及到了变量声明提升和函数声明提升。正如前面说到的函数声明提升,函数声明function getName(){}的声明会被提前到顶部。而函数表达式var getName = function(){}则表现出变量声明提升。因此在这种情况下,getName也是一个变量,因此这个变量的声明也将提升到底部,而变量的赋值依然保留在原来的位置。需要注意的是,函数优先,虽然函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量。因此上面的函数可以转换成下面的样子:

function getName(){    //函数声明提升到顶部
    console.log(1);
}
var getName;    //变量声明提升
getName = function(){    //变量赋值依然保留在原来的位置
    console.log(2);
}
getName();    // 最终输出:2
登录后复制

所以最终的输出结果是:2。在原来的例子中,函数声明虽然是在函数表达式后面,但由于函数声明提升到顶部,因此后面getName又被函数表达式的赋值操作给覆盖了,所以输出2。

相关推荐:



以上是js中变量声明以及函数声明提升的详细解析(附示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

C++ 函数声明中的默认参数:全面解析其声明和用法 C++ 函数声明中的默认参数:全面解析其声明和用法 May 02, 2024 pm 03:09 PM

C++中的默认参数提供对函数参数指定默认值的功能,从而增强代码可读性、简洁性和灵活性。声明默认参数:在函数声明中将参数后加上"="符号,后跟默认值。用法:函数调用时,若未提供可选参数,则会使用默认值。实战案例:计算两个数之和的函数,一个参数必填,另一个可填并有默认值0。优点:增强可读性、增加灵活性、减少样板代码。注意事项:只能在声明中指定,必须位于末尾,类型必须兼容。

C++ 函数的声明和定义的顺序有什么影响? C++ 函数的声明和定义的顺序有什么影响? Apr 19, 2024 pm 01:42 PM

在C++中,函数声明和定义的顺序影响编译和链接过程。最常见的是声明在前,定义在后;也可使用“forwarddeclaration”将定义放在声明前;如果两者同时存在,编译器将忽略声明,仅使用定义。

解决C++代码中出现的'error: use of undeclared identifier 'variable'”问题 解决C++代码中出现的'error: use of undeclared identifier 'variable'”问题 Aug 26, 2023 pm 01:46 PM

解决C++代码中出现的“error:useofundeclaredidentifier'variable'”问题在使用C++进行编程时,我们经常会遇到各种各样的错误。其中一种常见的错误是“error:useofundeclaredidentifier'variable'”。这个错误通常意味着我们在代码中使用了一个未声明的变量。这篇文章将详

C++ 函数声明和定义有什么区别? C++ 函数声明和定义有什么区别? Apr 18, 2024 pm 04:03 PM

函数声明告知编译器函数的存在,不包含实现,用于类型检查。函数定义提供实际实现,包含函数体。区分的关键特征包括:目的、位置、作用。理解差异对于编写有效且可维护的C++代码至关重要。

C++ 函数的声明和定义 C++ 函数的声明和定义 Apr 11, 2024 pm 01:27 PM

函数声明和定义在C++中是必要的,函数声明指定函数的返回类型、名称和参数,而函数定义包含函数体和实现。首先声明函数,然后在程序中使用它并传递所需的参数。使用return语句从函数中返回一个值。

C++编译错误:函数调用与函数声明不符,应该怎样解决? C++编译错误:函数调用与函数声明不符,应该怎样解决? Aug 22, 2023 pm 12:39 PM

C++编译错误:函数调用与函数声明不符,应该怎样解决?在开发C++程序时,难免会遇到一些编译错误,其中之一常见的错误是函数调用与函数声明不符的错误。这种错误广泛存在于C++程序员中,由于不注意函数声明的正确性,导致编译问题,最终浪费时间和精力修复问题,影响开发效率。避免这种错误的方法需要遵循一些规范和标准实践,下面让我们来了解一下。什么是函数调用与函数声明不

C++ 函数声明中的[[nodiscard]]:揭开忽略返回值后果的神秘面纱 C++ 函数声明中的[[nodiscard]]:揭开忽略返回值后果的神秘面纱 May 01, 2024 pm 06:18 PM

[[nodiscard]]属性指示函数的返回值不得忽略,否则将导致编译器警告或错误,以防止以下后果:未初始化异常、内存泄漏和错误的计算结果。

如何在PHP中使用变量 如何在PHP中使用变量 May 20, 2023 pm 02:33 PM

PHP是一种非常流行的Web开发语言,它允许开发人员在服务器端创建动态Web应用程序。在PHP中,变量是一种基本的数据结构,用于存储值和数据。本文将介绍如何在PHP中使用变量。变量的基本语法在PHP中声明变量的语法非常简单。变量名以美元符号($)开头,后面跟着变量名。变量名可以是字母、数字或下划线的组合,但必须以字母或下划线开头。例如,下面的代码声明了一个名

See all articles