函数声明可提升,定义前可调用;函数表达式不可提升,须先赋值再调用;箭头函数属表达式且无this,继承外层this;块级作用域仅限let/const,function声明仍提升至函数作用域;IIFE在ES6后需求减少但仍有私有上下文等不可替代场景。

函数声明和函数表达式怎么选
JavaScript 里定义函数主要就两种方式:function 声明和函数表达式,它们的行为差异直接影响调用时机和作用域可见性。
函数声明会被提升(hoisted),意味着你可以在定义前就调用它;函数表达式不会,必须先赋值再调用,否则会报 TypeError: xxx is not a function。
-
function sayHello() { return "hi"; }—— 可以在声明前调用 -
const sayHi = function() { return "hi"; };—— 必须在赋值后调用,否则sayHi是undefined - 箭头函数
const sayBye = () => "bye";属于函数表达式,同样不提升
调用时 this 指向为什么总出错
函数调用方式直接决定 this 的值,不是看函数怎么定义的,而是看怎么被调用的。
- 普通调用:
foo()→this在非严格模式下是window(浏览器)或globalThis,严格模式下是undefined - 方法调用:
obj.method()→this是obj - 用
call/apply/bind显式绑定 →this按传入对象确定 - 箭头函数没有自己的
this,它沿用外层函数作用域的this,这点常被误以为“更安全”,但其实只是继承,不能重绑定
函数作用域和块级作用域怎么共存
函数作用域是 JavaScript 最早的作用域模型,而 let/const 引入的块级作用域只对它们自身有效,不影响函数声明和 var 变量。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
立即学习“Java免费学习笔记(深入)”;
- 在
if或for块里用function foo(){}声明,该函数仍会提升到整个函数作用域顶部(不是块内) - 用
let foo = function(){}才真正受块限制,块外访问会报ReferenceError - 嵌套函数能访问外层函数的变量(闭包),但外层无法访问内层函数声明的
let变量
立即执行函数(IIFE)现在还必要吗
ES6 之后,let/const 和模块系统让 IIFE 的“隔离变量”需求大幅下降,但它在特定场景仍有不可替代性。
- 需要立刻运行并返回一个私有上下文时仍适用,比如封装插件、避免污染全局:
(function(){ let privateVar = 42; window.myAPI = { get: () => privateVar }; })(); - 在循环中捕获当前迭代值,比
var+setTimeout更直观(不过现在更推荐用let声明循环变量) - 注意:IIFE 内部用
function声明的函数仍受函数作用域约束,不是块作用域
作用域链的实际表现往往藏在调用栈深处,尤其当高阶函数、异步回调和 this 绑定混用时,最易出问题的是「以为函数记住了某个值,其实它引用的是变量本身」——这恰恰是闭包的本意,也是最容易被忽略的细节。










