作用域是原始码中定义变数的区域,他规范了目前程序码应该要去哪里查找变数,而作用域又可分为 静态作用域
与 动态作用域
,首先先来了解两者的差别。
静态作用域又称作语法作用域(Lexical scoping),他在函数定义时就已经决定作用域,而且不会再改变,JavaScript 属於此类。
以下为静态作用域范例,运作步骤如下:
变数 num
赋予值 1。函式 fn2
,在函式内命名一个 变数 num
赋予值 2,因静态作用域的关系,函式 fn2
中的 变数 num
,作用域只在 函式 fn2
中,接着呼叫 函式 fn1
。函式 fn1
内因没有 变数 num
,又因静态作用域的关系,所以会向外层(全域)查找,故 console.log(num); 显示为 1
。// 静态作用域范例
var num = 1;
function fn1() {
console.log(num); // 1
// 因静态作用域,又因 fn1 没有变数 num,所以会向外(全域)查找
}
function fn2() {
var num = 2;
//变数 num 作用域只在函式 fn2 中
fn1();
}
fn2();
动态作用域会在函式调用时才会决定作用域。
以下为动态作用域范例,运作步骤如下:
变数 num
赋予值 1。函式 fn2
,在函式内命名一个 变数 num
赋予值 2,接着呼叫 函式 fn1
。函式 fn1
内因没有 变数 num
,又因动态作用域的关系 - 函式调用时才会决定作用域,所以会向上一层 函式 fn2
查找 变数 num
,故 console.log(num); 显示为 2
。// 动态作用域范例
var num = 1;
function fn1() {
console.log(num); // 2
// 因动态作用域,在函式调用时才会决定作用域,所以会向上一层 fn2 宣告的位置找变数的值
}
function fn2() {
var num = 2;
fn1();
}
fn2();
若所有作用域都找不到变数时,则会出现 ReferenceError: 变数 is not defined
的错误讯息,范例如下。
>>: Day18 Laravel - CRUD .feat RESTful API
天亮了 前晚是1号玩家死亡 关於迷雾森林故事 反指标 洛神:2号玩家请继续发言 2号:1号是猎人他带...
上次我们最後提到一些例子 -sh sharpness -100~100 -br brightness...
资料来源 在学习过中曾参考许多文章与影片 reactivex Intro to Reactive P...
俗话说得好:「工欲善其事,必先利其器」。 没有一个好用的文字编辑器,要如何轻松愉悦的写程序呢? 安...
最近bot的更新量蛮大,有时候会关掉bot方便更新程序码 为了让频道上的人知道目前bot的状态,决定...