JS中常见的三种函数声明(statement)方式有这三种:

// 函数表达式(function expression)
var h = function () {
// h
} // 函数声明(function declaration)
function h() {
// h
}
// 构造函数(function constructor)
function H() {
    // H 
}

先说三者的显著区别:

第一种声明方式也就是var声明方式,函数表达式,又叫做函数字面量(Function Literals)、函数直接量(Function direct quantity), 函数只有在var语句声明之后才能被调用

第二种声明方式也就是function声明方式,函数可以在function声明之前被调用

第三种声明方式也就是构造函数声明方式,函数可以在function声明之前被调用,不同于函数声明的是构造函数的函数名首字母要大写

因为在函数预编译过程中,会将函数声明整体提升,而对于var变量只会把var h进行提升,然后再在代码运行阶段进行赋值

对第一种情况,函数表达式是在函数运行阶段才赋值给变量h

对第二种情况,函数声明是在代码运行阶段之前,也就是代码解析阶段才赋值给标识符h

对第三种情况,构造函数也是在代码运行阶段之前,也就是代码解析阶段才赋值给标识符H

为了证明这种说法可以看下面两个例子:

对应第一种情况,

console.log(h)  // undefined
var h = function () {
// h
} console.log(h)  // function () {//h} h = function () {
// h1
}

console的结果是

undefined

ƒunction () {
  // h
}

因为赋值发生在代码运行阶段, 代码自上而下运行console.log(h)所在位置只能获取它之前的赋值

对应第二种情况,第三种情况,

console.log(h)  // function h() {//h}
function h() {
// h
} console.log(h)  // function h() {//h}
function h() {  
    // h1
}

console的结果是

ƒunction h() {
   // h1
}
ƒunction h() {
   // h1
}

因为赋值发生在代码解析阶段,代码运行到console.log(h)时解析早已完成, 而解析的结果是后面那个函数h,故会打印此结果

深入:

JS声明函数的三种方式:

1. 函数表达式: 即上面第一种方式,这种方法使用function操作符创建函数,表达式可以存储在变量或者对象属性里。函数表达式往往被称为

匿名函数,因为它没有名字。证明这一点你可以 console.log(h.name); 可以看到打印为空 "",而h只是对函数的引用,不是函数名。

2. 函数声明: 即上面第二种方式,会声明一个具名函数,且函数能在其所在作用域的任意位置被调用,其创建的函数为具名函数,证明这一

点你可以 console.log(h.name); 可以看到打印为 "h"。 可在后面的代码中将此函数通过函数名赋值给变量或者对象属性

3. 构造函数function Fun(){}:不推荐这种用法,容易出问题,通常用于原型链中

深入了解函数字面量和函数直接量:

https://blog.csdn.net/qq_25178609/article/details/51669870  https://blog.csdn.net/superhoy/article/details/52946157

JS中var声明与function声明以及构造函数声明方式的区别的更多相关文章

  1. js中var的有或无--重复声明和以后的声明

    js中var的有或无--重复声明和以后的声明 使用var语句多次声明一个变量不仅是合法的,而且也不会造成任何错误. 如果重复使用的一个声明有一个初始值,那么它担当的不过是一个赋值语句的角色. 如果重复 ...

  2. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  3. 【前端开发】】js中var写和不写的区别

    js中var用与不用的区别 Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. v ...

  4. JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?jQuery中的text()、html()和val()

    一.JS中innerHTML.outerHTML.innerText .outerText.value的区别与联系?jS中设置或者获取所选内容的值:①innerHTML :属性设置或返回该标签内的HT ...

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

    js中有两种声明函数的方法,分别为: var functionOne = function() { // Some code }; function functionTwo() { // Some c ...

  6. JS中var声明与function声明两种函数声明方式的区别

    JS中常见的两种函数声明(statement)方式有这两种: // 函数表达式(function expression) var h = function() { // h } // 函数声明(fun ...

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

    stackOverflow中看到了很久以前问的一个关于函数声明的问题,问题对函数剖析的特别深.这里翻译了一下组织成一篇小博文,加深一下对这两种声明方式的印象.虽是老调重弹,但是只要能帮助理解问题,不管 ...

  8. JavaScript中var变量引用function与直接声明function

    今天在h5开发app的过程中遇到了一个js问题,function的执行问题 在js中声明函数function有这两种方法 var A=function(){...} 或者 function A(){. ...

  9. js中var的重复声明

    腾讯的一个笔试题,先看一下 var a = 100;function fn() { alert(a); //undefined var a = 200; alert(a); //200}fn();al ...

随机推荐

  1. 洛谷 P5564: [Celeste-B]Say Goodbye

    题目传送门:洛谷 P5564. 题意简述: 有 \(n\) 个点,染 \(m\) 种颜色,第 \(i\) 种颜色染恰好 \(cnt_i\) 个节点,满足 \(cnt_1+cnt_2+\cdots+cn ...

  2. day22_7.26面向对象之封装(接口与抽象)

    一.封装. 封装就是将丑陋复杂的隐式的细节隐藏到内部,对外提供简单的使用接口. 对外隐藏内部实现细节,并提供访问的接口.对内使用self操作. 二.为什么要封装? 对于一个计算机来说,不可能不使用机箱 ...

  3. 【问题篇四】SpringBoot的properties文件不能自动提示解决方法(1)

    一.Eclipse 解决方法:Eclipse中安装Spring Tools Suite(STS). 这里采用离线安装的方式. 1. 官网:https://spring.io/tools3/sts/al ...

  4. 自定义web框架(django)

    Django基础了解知识 HTTP协议(超文本传输协议) HTTP协议 四大特性: 基于TCP/IP之上作用于应用层 基于请求响应 无状态 引申出cookie session token-- 无连接 ...

  5. USACO River Crossing

    洛谷 P2904 [USACO08MAR]跨河River Crossing https://www.luogu.org/problem/P2904 JDOJ 2574: USACO 2008 Mar ...

  6. JDOJ 1152 是否是素数

    1152: 是否是素数 https://neooj.com:8082/oldoj/problem.php?id=1152 题目描述 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息. ...

  7. Python进阶-XI 常用模块之一:collections、time、random、os、sys

    简要介绍一下各种集合: 列表.元组.字典.集合(含frozenset).字符串.堆栈(如手枪弹夹:先进后出).队列(如马克沁机枪的弹夹:先进先出) 1.collections 1)queue 队列介绍 ...

  8. The 13th Chinese Northeast Collegiate Programming Contest

    题解: solution Code: A. Apple Business #include<cstdio> #include<algorithm> #include<ve ...

  9. 区块链自问自答 day2

    区块链自问自答 day2 区块链的自治性是如何达成的?为什么能够在去信任的环境下自由安全地交换数据? ​ 区块链中有众多的节点,包含了恶意节点.故障节点.正常节点,想要这些节点共同做出一致的决定就需要 ...

  10. KMP 串的模式匹配 (25分)

    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...