探索函数作用域(普通函数与箭头函数的区别)

本文详细探讨了JavaScript中的函数作用域,对比了普通函数与箭头函数的区别,揭示了它们在作用域、this指向等方面的不同,帮助开发者更好地理解和使用这两种函数形式。
// 探索作用域this,箭头函数域普通函数的区别
// 箭头函数的定义是保证函数里的this是是定义域的this,
// 如果调用他的对象没有该函数,依旧会报undefined is not a Function

function scopeOfFuns(){
    console.log("out fun:",this);
    function scopeOfFunIn(){
        console.log("in funs:",this)
    }
    scopeOfFunIn();
}

const scopeOfArrowFuns = () => {
    console.log("arrow fun out:",this);
    const scopeOfArrowFunsIn = () => {
        console.log("arrow fun in",this);
    }
    scopeOfArrowFunsIn();
}

const scopeOfArrowFuns1 = () => {
    console.log("arrow fun out:",this);
    function scopeOfArrowFunsIn(){
        console.log("arrow fun in",this);
    }
    scopeOfArrowFunsIn();
}

function scopeOfFuns1(){
    console.log("out fun:",this);
    const scopeOfFunIn = () => {
        console.log("in funs:",this)
    }
    scopeOfFunIn();
}

function funTest() {
    const scopeOfFunIn = () => {
        console.log("in funs:",this)
    }
    let obj = {name:'tabqq'}
    function scopeOfFuns1(){
        console.log("out fun:",this);
        this.scopeOfFunIn();
    }
    scopeOfFuns1.call(obj);
}

let arr = {
    'hello':'so'
}

this.scopeOfFuns.apply(arr);
this.scopeOfArrowFuns.appy(arr)

 

### 箭头函数的概念 箭头函数是 ES6 中引入的一种简洁的函数定义方式。使用 ES6 箭头函数语法定义函数,需将原函数的“function”关键字函数名都删掉,并使用“=>”连接参数列表函数体。当函数参数只有一个时,括号可以省略;但没有参数时,括号不可以省略。箭头函数完全修复了 `this` 的指向,`this` 总是指向词法作用域,它没有自己的 `this`,总是指向外部作用域 [^2]。 例如: ```javascript // 普通函数 function add(a, b) { return a + b; } // 箭头函数 const addArrow = (a, b) => a + b; ``` ### 作用域的概念 作用域是指变量函数的可访问范围,它控制着变量函数的可见性生命周期。常见的作用域类型有全局作用域函数(局部)作用域块级作用域 [^3]。 - **全局作用域**:在代码的任何地方都可以访问的变量函数所处的作用域,在全局作用域中声明的变量函数可以被整个程序使用。 ```javascript var globalVariable = 'I am global'; function globalFunction() { console.log('This is a global function'); } ``` - **函数(局部)作用域**:在函数内部声明的变量函数只能在该函数内部访问,函数外部无法直接访问这些变量函数。 ```javascript function myFunction() { var localVariable = 'I am local'; console.log(localVariable); } // 这里无法访问 localVariable ``` - **块级作用域**:由 `{}` 包裹的代码块形成的作用域,ES6 中使用 `let` `const` 声明的变量具有块级作用域。 ```javascript { let blockVariable = 'I am in block scope'; console.log(blockVariable); } // 这里无法访问 blockVariable ``` ### 箭头函数作用域的关系 箭头函数不会创建自己的 `this`,它只会从自己的作用域链的上一层继承 `this`。可以简单地理解为箭头函数的 `this` 继承自上层的 `this`,但在全局环境下定义仍会指向全局对象 [^4]。 例如: ```javascript var arrow = { fn: () => { console.log(this); } }; arrow.fn(); // 在浏览器环境下指向 window 对象 ``` ### 作用域作用域链是由多个作用域组成的链表,当查找一个变量时,JavaScript 引擎会先在当前作用域中查找,如果找不到,就会沿着作用域链向上一级作用域查找,直到找到该变量或到达全局作用域 [^3]。 例如: ```javascript var globalVar = 'global'; function outer() { var outerVar = 'outer'; function inner() { var innerVar = 'inner'; console.log(innerVar); // 访问当前作用域的变量 console.log(outerVar); // 访问上一级作用域的变量 console.log(globalVar); // 访问全局作用域的变量 } inner(); } outer(); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值