javascript函数如何定义和调用?_探索javascript函数的作用域【教程】

11次阅读

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

javascript函数如何定义和调用?_探索javascript函数的作用域【教程】

函数声明和函数表达式怎么选

javaScript 里定义函数主要就两种方式:function 声明和函数表达式,它们的行为差异直接影响调用时机和作用域可见性。

函数声明会被提升(hoisted),意味着你可以在定义前就调用它;函数表达式不会,必须先赋值再调用,否则会报 TypeError: xxx is not a function

  • function sayHello() { return "hi"; } —— 可以在声明前调用
  • const sayHi = function() { return "hi"; }; —— 必须在赋值后调用,否则 sayHiundefined
  • 箭头函数 const sayBye = () => "bye"; 属于函数表达式,同样不提升

调用时 this 指向为什么总出错

函数调用方式直接决定 this 的值,不是看函数怎么定义的,而是看怎么被调用的。

  • 普通调用:foo()this 在非严格模式下是 window浏览器)或 globalThis,严格模式下是 undefined
  • 方法调用:obj.method()thisobj
  • call/apply/bind 显式绑定 → this 按传入对象确定
  • 箭头函数没有自己的 this,它沿用外层函数作用域的 this,这点常被误以为“更安全”,但其实只是继承,不能重绑定

函数作用域和块级作用域怎么共存

函数作用域是 javascript 最早的作用域模型,而 let/const 引入的块级作用域只对它们自身有效,不影响函数声明和 var 变量。

立即学习Java免费学习笔记(深入)”;

  • iffor 块里用 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 绑定混用时,最易出问题的是「以为函数记住了某个值,其实它引用的是变量本身」——这恰恰是闭包的本意,也是最容易被忽略的细节。

text=ZqhQzanResources