function(){}、var fun=function(){}和function fun(){}的区别

预解析(重点) 如果有错,欢迎指出 阅读详情

一、基本定义

1.函数声明:使用function声明函数,并指定函数名。

function fun() {
    // ......   
}

2.函数表达式:使用function声明函数,但未指定函数名,将匿名函数赋予一个变量。

var fun = function() {
    // ......
}

3.匿名函数:使用function声明函数,但未指定函数名。匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。

function() {
    // ......
}

二、实例补充

1. 函数声明可在当前作用域下提前调用执行,函数表达式需等执行到该函数后,方可执行,不可提前调用。

fun();
function fun() {
    // ...... 
}
// 正确,函数声明可提前调用
fun()
var fun = function() {
    // ......
} 
// 错误,fun未保存对函数的引用,函数调用需放在函数表达式后面

2.函数表达式可直接在函数后加括号调用。

//传统方法
var fun1 = function() {
    console.log('哈哈');
}
fun1();

//函数表达式后直接加括号调用            
var fun2 = function() {
    console.log('哈哈');
}()

3.立即执行函数(function(){})()的第一个小括号必须要加,因为如果不加第一个小括号的话,虽然匿名函数属于函数表达式,但未进行赋值,所以javascript解析时将开头的function当做函数声明,故报错提示需要函数名。加了第一个小括号,意思就是将函数声明转化为函数表达式。

//正确      
(function(){
    console.log('哈哈');
})();
// 报错
function(){
    console.log('哈哈');
}();

4.(function(){})()立即执行函数的注意点:在第一对括号内是一个匿名函数,第二个括号会立即调用这个匿名函数的返回值,也就是匿名函数中的内容被立即执行。这个玩意儿的强大之处在于它独立了一个作用域(括号中内容执行完后会被立即回收),内部变量外部无法访问,而它又能通过this保留字,来访问外部变量。好处:内部定义的变量不会跟外部的变量有冲突,达到保护内部变量的作用。

三、JavaScript变量提升的概念

变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。

1.变量可以在使用后声明,也就是变量可以先使用再声明。(因为函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部)

x = 5; // 变量 x 设置为 5
console.log(x);    //正常输出5
var x; // 声明 x


var y; // 声明 y
y = 5; // 变量 y 设置为 5
console.log(y);    //正常输出5

2.JavaScript初始化不会提升。(JavaScript 只有声明的变量会提升,初始化的不会。)

var x = 1;  // 初始化 x
var y = 2;  // 初始化 y
console.log(x);  //正常输出1
console.log(y);  //正常输出2


var a = 3;  // 初始化 a
console.log(a);  //正常输出3
console.log(b);  //输出undefined
var b = 4;  // 初始化 b

3.一个有趣的例子

var a = 1;  //初始化a为1
var b = 2;  //初始化b为2

var fun=function(){
    console.log(a); //undefined 
    var a = 22;
    console.log(b); //undefined 
    var b;
}
fun();

为什么会得到上述结果呢?原因如下:

JavaScript 只有声明的变量会提升,初始化的不会。所以在function中,有var a = 22,这是初始化,变量的声明会提升,但是变量的值没有提升。有var b , 声明的变量会提升到function最开头,但因为没有赋值,所以会输出undefined。上述代码等价于:

var a = 1;  //初始化a为1
var b = 2;  //初始化b为2
var fun=function(){
    var a;
    var b;
    console.log(a); //undefined 
    a = 22;
    console.log(b); //undefined 
}
fun();

4.另一个有趣的例子

var a = 1;  //初始化a为1
(function(){
    a=3;
    console.log(a);  //3
    var a;            
})();

(function(){
    console.log(this.a);  //1            
})();

var fun=function(){
    console.log(this.a);  //1
}
fun();

关键:立即执行函数、函数表达式和函数声明能通过this保留字,来访问外部变量。

当然如果function函数内部没有声明外部已有变量的话,function函数内部可直接使用外部已有变量,不使用this保留字也是可以的。(函数声明、函数表达式、立即执行函数结果都是这样,原因应该是当在function函数内部没有找到定义的变量时,会自动扩大作用域,向上搜索给出的变量)

var a = 1;  //初始化a为1
(function(){
    console.log(a);  //1        
})();
var fun=function(){
    console.log(a);  //1
}
fun();
FPGA以太网接口设计避坑指南:GMII与RGMII时序转换的三种实现方案对比 本文深入解析FPGA以太网接口设计中GMII与RGMII时序转换的三种实现方案,包括Xilinx官方IP核、手工原语逻辑和开源方案gmii_to_rgmii。通过对比分析各方案的优缺点和适用场景,为工程师提供技术选型指南,帮助避免常见设计陷阱,提升高速网络设备开发的效率和可靠性。 阅读详情

相关推荐

第3章 信息技术服务(一)

对 第三章 《信息技术服务》中第一、二、三节 <内涵与外延、原理与组成、服务生命周期>进行总结、归纳

好好学习,天天向上的博客 733

变量的提升

//变量的提升:所有使用var声明的变量都会提升:提前到作用域一开始的位置被声明,该赋值的位置再赋值 console.log(a); var a =10; //代码解析、以上代码等同于一下代码 var a ; console.log(a); a = 10 ; //所以输出 undefined, 表示a定义了,但是没有赋值 例2: function fn (){ console.log(a); v...

xiongderui的博客 225

Arduino四足开源机器猫-Opencat(导航贴)

本内容由我和小伙伴共同编写,未经授权,谢绝转载! 1.项目介绍 2.组装调试教程 (一)Opencat-F (1)资料地址(包含程序代码&&3D打印图纸): 链接:https://pan.baidu.com/s/1AcVA5jSiOSzRKqEQAomrTA 提取码:szfx (2) (二)Opencat-B (1)组装调试 (2)组装调试注意事项 (3)添加新技能 3.编程 ...

qqliuzhitong的博客 4172

function a(){} 和 var a = function(){}的区别

用代码直接说明一下这两者在调用方面的区别 function a(){ console.log("a"); } 这种的常见的function 可以在 此 函数位置的前后调用都可以, 是被先加载的 看下面这个方法 var twoSum = function (nums, target) { console.log(nums + "----" + target); }; 这种方法 只能在执行这语句的时候, 这个function才会被加载, 所以如果你在此函数的前面调用 就会

AzeShinja的博客 358

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南

本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。

weixin_29188043的博客 330

JavaScript函数

标题函数 一:回顾 this:存在不同环境,不同的位置所代表的值是不一样的,取决于当前函数被调用时所处的环境(调用函数的对象) 事件函数中:this指向触发事件对象 自定义属性 一个标签两种状态,但是标签有很多个 标签.tag = true 需要下标,但是没有,标签.index = 下标 二、函数 函数:函数是由事件驱动的或者当他被调用时可重复使用的代码块 1、函数的应用场景 作为事件处理函数 oDiv.onclick = function(){ } 函数封装 functio

juan_bing的博客 219

RK3588开发笔记-Buildroot编译host-nodejs报错解决ModuleNotFoundError: No module named ‘_bz2‘

在RK3588的开发过程中,使用Buildroot进行系统的构建和编译是一个常见的选择。然而,在编译host-nodejs的过程中,有时会遇到报错信息提示。这个错误通常是由于Python环境中缺少相应的模块导致的。以下将记录我解决这个问题的过程。。在RK3588的开发过程中,使用Buildroot编译host-nodejs时遇到的错误,通常是由于缺少相应的Python模块导致的。通过配置buildroot pythong bzip2开发库并重新编译,可以解决这个问题。

flypig has a dream! 898

var fun =function(){}与function fun()的区别

某天写代码突然县道这个问题,顺势总结一波 JavaScript 函数和变量声明的“提前”(hoist)行为 简单的说 如果我们使用 匿名函数 var a = {} 这种方式, 编译后变量声明a 会“被提前”了,但是他的赋值(也就是a)并不会被提前。 也就是,匿名函数只有在被调用时才被初始化。 如果使用 function a(){}; 这种方式, 编译后函数声明和他的赋值都会被提前...

qq_37054146的博客 529

Android面试指南及参考答案

【摘要】LesPark招聘Android开发工程师,要求3年以上经验,负责客户端功能开发与优化。岗位需掌握Java、多线程、网络编程(TCP/UDP/HTTP)及性能调试工具。面试重点考察:1)核心技术如网络协议选择(TCP可靠消息/UDP实时音视频)、内存泄漏分析;2)业务能力如图片懒加载三级缓存设计、启动速度优化案例;3)高阶系统原理如插件化框架设计;4)行为问题应对策略。建议候选人准备并发编程、JVM差异等深度知识,并量化项目优化成果,尤其关注社交应用相关的图片处理、实时通信等场景题。

郑伟强dev的专栏 804

Open3D(C++) 点云构建三维Delaunay三角剖分

C++版本的Open3D实现从点云构建三维Delaunay,可视化效果。

点云侠的博客 2247

JavaScript中函数function fun(){}和 var fun=function(){}的区别

function fun(){} 和 var fun=function(){}的区别 标题有点长···· 废话少说,其实他们的主要区别就是“函数声明的提前行为”. var fun=function(){ alert("hello world!"); }; fun();       //hello world! /****************************...

weixin_30312563的博客 1328

基于传统算法的半导体晶圆缺陷检测原理及代码(二)

了解基于传统算法的半导体晶圆缺陷检测原理和方法,对于深入理解半导体制造工艺和质量控制具有重要意义。在半导体制造技术持续创新的浪潮中,基于传统算法的缺陷检测技术也将不断演进,为半导体产业的高质量发展提供坚实可靠的技术支撑,确保在芯片制造的每一个环节都能精准识别和管控缺陷,推动半导体产业迈向更高的发展水平。基于传统算法的半导体晶圆缺陷检测技术在半导体制造的长期发展历程中扮演了重要角色,凭借其成熟的技术体系、较快的检测速度和相对较低的成本,在各个工艺阶段为保障晶圆质量发挥了关键作用。

m0_44975814的博客 2220

JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别?

方法一: var foo = function () { //code } 方法二: function foo () { //code } 有什么区别? 最关键的区别在于JavaScript 函数和变量声明的“提前”(hoist)行为。the Google style guide 建议我们采用方法一。简单的说 如果我们使用 匿名函数 ...

weixin_30462049的博客 179

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

function 和var的区别

var fun=function(){}与function fun同样是定义一个fun两者有何区别呢?无论是效果还是使用都可以说一样的,但它们两却有异同的地方。我们来做一个小测试吧。 functionfun(){alert(0);}fun();varfun=function(){alert(1);}fun();varfun=function(){...

weixin_30386713的博客 304

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

var foo = function () {} 和 function foo()

最关键的区别在于JavaScript 函数和变量声明的“提前”(hoist)行为。 the Google style guide 建议我们采用方法一。 简单的说 如果我们使用 匿名函数 var FUNCTION_NAME = function() { /* FUNCTION_BODY */}; 这种方式, 编译后变量声明FUNCTION_NAME 会“被提前”了,但是他

Good good study! 2379

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于js函数的写法 fun = function(){} fun:{}有什么不同

这几种方法每一个都有不一样的作用。 1.myfun:function(){} 这个是必须写在对象内部的,这是一个对象的方法,如 1 2 3 var a = {    myfun:function(){}  } 写在外面会报错。 2.任何时候都不要这样写myfun = function(){},

Manketon的专栏 3533

The Concise TypeScript Book 深度解读:TypeScript 类(Class)完整实战指南

> 本指南基于开源项目 The Concise TypeScript Book 中关于类的章节(英文原版见 [website/src/content/docs/book/class.md](https://link.gitcode.com/i/07e22a9457259f9f91870ae5ad674051),法文译本见 [website/src/content/docs/fr-fr/book/c

gitblog_00858的博客 794

var foo = function () {} 和 function foo() 有什么区别?

简单的说 如果我们使用 匿名函数 var FUNCTION_NAME = function() { /* FUNCTION_BODY */}; 这种方式, 编译后变量声明FUNCTION_NAME 会“被提前”了,但是他的赋值(也就是FUNCTION_BODY)并不会被提前。也就是,匿名函数只有在被调用时才被初始化。如果我们使用 function FUNCTION_N...

weixin_30241919的博客 180

Dart函数调用:fun与fun()的本质区别与应用场景

函数作为编程语言的核心概念,其调用方式直接影响程序执行流程。在Dart语言中,函数是一等公民,理解函数引用与函数调用的区别至关重要。函数引用(如`fun`)获取的是函数对象本身,常用于回调传递或变量存储;而函数调用(如`fun()`)会立即执行函数体,适用于需要即时获取返回值的场景。这种区别在事件处理、延时执行等实际开发中尤为关键,比如在Flutter的按钮事件处理中错误地立即调用函数会导致逻辑异常。掌握Dart的函数类型系统(如`() => void`)和空安全调用语法,能够编写更健壮的高阶函数代码,同时

weixin_30879833的博客 415

function,new function()和 new Function()

函数是javascrpit中的一等公民,提供了function关键字和Function()这个内置对象。 function和new function()以及new Function()之间的区别一直都会让人造成困扰,下面是一些简单的学习心得。 function 最常用的function用法就是定义函数 var foo = function(){ var temp = 100...

weixin_30682415的博客 353

JQ的$(function(){})与window. onload的区别

最近一直在研究jq的源码,书写jq的代码我们通常会包裹在一个 $(function(){}) 函数中, jq的 $(function(){}) 也就是 $(document).ready(function(){}) 的简写,与之对应的原生js的 window.onload 事件,这俩者之间到底有什么区别呢? $(function () { console.log("ready执行")...

CaseyWei 1239

C++11:std::function<void()> func;

转自:使用std::function作为函数入参 关于std::function() 在C语言的时代,我们可以使用函数指针来吧一个函数作为参数传递,这样我们就可以实现回调函数的机制。到了C++11以后在标准库里引入了std::function模板类,这个模板概括了函数指针的概念 函数指针只能指向一个函数,而std::function对象可以代表任何可以调用的对象,比如说任何可以被当作函数一样调用的对象。 当你创建一个函数指针的时候,你必须定义这个函数签名(表征这个函数的入参,返回值等信息);同样的,当你创建

苦逼的程序猿☺ 1万+
上一篇: videojs+hls+rtmp网页播放
下一篇: CSS——对position定位和margin-top的理解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值