• JavaScript中如何确定this的值?如何指定this的值?


    🎀JavaScript中的this

    在绝大多数情况下,函数的调用方法决定了this的值(运行时绑定)。this不能在执行期间被赋值,并且在每次函数呗调用时this的值也可能会不同。

    🍿如何确定this的值:

    在非严格模式下,总是指向一个对象,在严格模式下可以是任意值。

    1. 全局执行环境中,指向全局对象window(非严格模式、严格模式)

    2. 在函数内部,取决于函数被调用的方式

      ⑴ 直接调用时的this值:
         ① 非严格模式:全局对象(window)
         ② 严格模式:undefined

      ⑵对象方法调用时的this值
          ① 调用者

    // ------------- 1.全局执行环境 -------------
        //  严格模式,非严格模式 全局对象(window)
        // 'use strict'
        // console.log(this)
    
        // ------------- 2.函数内部 -------------
        // 2.1 直接调用-非严格模式
        // function func() {
        //   console.log(this) // window
        // }
        // func()
        // 2.1 直接调用-严格模式
        // function func() {
        //   'use strict'
        //   console.log(this) // undefined
        // }
        // func()
    
        // 2.2 对象方法调用
        const food = {
          name: '猪脚饭',
          eat() {
            'use strict'
            console.log(this)
          }
        }
        // 非严格模式,严格模式
        food.eat() // 调用者food对象
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这里插入图片描述

    ✨什么是严格模式,怎么开启一个严格模式

    严格模式是采用具有限制性JavaScript变体的一种方式,从而使代码隐式地脱离“马虎模式/稀松模式/懒散模式“(sloppy)模式。

    1. 严格模式通过抛出错误来消除了一些原有静默错误。
    2. 严格模式修复了一些导致 JavaScript 引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
    3. 严格模式禁用了在 ECMAScript 的未来版本中可能会定义的一些语法。
     	// 1.为整个脚本开启严格模式
     	'use strict' 
    
     	function func(){
     	// 2.为函数开启严格模式
     	'use strict'  
     	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    需要注意的是 这两中开启严格模式的方法 ‘use strict’ 这一段代码都需要写在最顶端,它的上面不能有别的代码(不包括注释)

    🎏如何指定this的值

    ✨1. 调用时指定

    🎉⑴.call()
    	func.call(thisArg,参数1,参数2...)
    
    • 1
    🍧⑵.apply()
    	func.apply(thisArg,[参数1,参数2...])
    
    • 1
    	// ------------- 1. 调用时指定this: -------------
    	  function func (numA, numB) {
    	      console.log(this)
    	      console.log(numA, numB)
    	    }
    	    const person = {
    	      name: 'zhangsan'
    	    }
    	    // 1.1 call:挨个传入参数
    	    func.call(person, 1, 2)
    	
    	    // 1.2 apply:以数组的方式传入参数
    	    func.apply(person, [3, 4])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    🎡2. 创建时指定

    🎶1.bind()
    	 const bindFunc=func.bind(thisArg,绑定参数1,绑定参数2...)
    
    • 1
       function func (numA, numB) {
    	      console.log(this)
    	      console.log(numA, numB)
    	    }
    	    const person = {
    	      name: 'zhangsan'
    	    }
    	      // 2.1 bind方法
    	    const bindFunc = func.bind(person, 666)
    	    bindFunc(888)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    🍿2.箭头函数
        const person = {
    	      name: 'zhangsan',
    	      sayHi () {
    	        //这个箭头函数是写在sayHi方法里面的这个this的值取决于sayHi的this
    	        setTimeout(() => { console.log(this) })
    	      
    	      }
    	    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    const food = {
          name: '西兰花炒蛋',
          eat () {
            console.log(this,1) 
            setTimeout(() => {
              console.log(this,2)
            }, 1000)
            setTimeout(function () {
              console.log(this,3)
            }, 1000)
          }
        }
        food.eat()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

  • 相关阅读:
    动态文字闪图怎么做?手把手教你在线做动态闪图
    关于Mysql数据库的停止服务修复及修复成功后的导入问题
    爱上开源之golang入门至实战第四章函数(Func)(八)
    实景三维渐成测绘大趋势,数据存储迎来新风口
    关于GIT的万年坑你还在踩吗?答应我别傻了
    Clickhouse表引擎介绍
    基于遗传算法的大规模电动汽车充电行为优化
    ChatGPT/GPT4科研应用与AI绘图及论文高效写作
    浅淡 C++ 与 C++ 入门
    Python 内置函数详解 (3) 进制转换
  • 原文地址:https://blog.csdn.net/sinat_51673411/article/details/133470360