美文网首页
JS中this的作用

JS中this的作用

作者: 熊啊熊c | 来源:发表于2021-03-16 15:01 被阅读0次

this的用途

JS在允许在函数内部引用当前执行上下文中的变量

username = "里斯"
function getUserName(){
    console.log(username)  //>>里斯
}

用来优雅准确的告诉当前运行的函数所处的上下文环境

怎么优雅的指向上下文变量

当前运行所处的上下文环境的名称很长时可以使用this来指代当前运行上下文环境

let LoneLongLongNameUser = {
    name:'张三',
    getUserName(){
       console.log(this.name);
    },
    getUserName1(){
        console.log(LoneLongLongNameUser.name);
    },
}
LoneLongLongNameUser.getUserName()  //>>张三
LoneLongLongNameUser.getUserName1() //>>张三

怎么准确的指向上下文

可以准确的指向某个对象,不会产生歧义

let User = {
    name:'张三',
    getUserName(){
       return (this.name);
    },
}

//闭包隔离重名变量
function func() {
    let User = {
        name:'李四',
        //容易看成调用全局变量的name
        getUserName(){
            return (User.name);
        },
        //调用局部变量name
        getUserName1(){
            return (this.name);
        },
    };
    console.log(
        User.getUserName(),
        User.getUserName1()
    )
}
func()//>> 李四 李四

JavaScript的this指向函数调用位置的对象,即调用函数的对象,函数在被某个对象调用时this存储着调用该函数对象的值。函数在未经过.调用时this会默认指向window对象。

怎么判断this指向了谁

由于this指向调用该函数的对象,所以找到是谁在哪里调用该函数就容易判断出this到底指向了哪里

var module = {
  x: "1891",
  getX: function() {
    return this.x;
  }
}

console.log(module.getX());//>> 1891
var getX = module.getX;//注意:getX和module.getX都是指向内存中函数的地址而已,它们并没有被“()”以便执行
                       //这里实际上是【间接引用】的模式,见文尾【壹.2.3.6】解释
console.log(getX()); //>> undefined

上述代码,一共调用了两次getX()

  • 作为module对象的函数被调用
  • 作为全局函数被调用,var getX = module.getX 在被赋值的时候只是获取module对象中getX函数的内部逻辑,并没有带有该函数声明时所处的上下文环境,所以在console中调用的时候是作为全局函数在被调用,this默认指向window。但window中并没有x变量。

this的指向规则

默认指向

函数在独立调用的时候

  • 非严格模式下指向window
var a = "apple";
function func(){
  console.log(this.a)
}
func() //>>apple 
  • 严格模式下指向undefined
var a = "apple";
function func(){
  'user strict'
  console.log(this.a)
}
func() //>>undefied
  • 在被延迟执行的函数中this也遵循默认指向规则

隐式指向

函数体内的this由调用者的调用位置决定,如果函数被对象调用,那么函数内部的this指向调用函数的对象,this指向最靠近被调用函数的对象,离得远的不是。

function func() {
  console.log(this.a);
}
var obj = {
  a: 2,
  func: func
};
obj.func(); //>> 2
// 找到调用位置,由 obj 对象来调用函数func,
// 此时可以说函数func被调用时,obj 对象“拥有”或者“包含”func函数,
// 所以此时的 this 指向调用 func 函数的 obj 对象。

显示指向

new操作符后指向

如何利用规则判断this的指向

this指向的例外情况

相关文章

  • 2019-08-13JS里面的作用域Scope

    作用域指一个变量的作用范围。 JS的作用域 在JS中,有两种作用域 全局作用域直接编写在script标签中 JS代...

  • JS中this的作用

    this的用途 JS在允许在函数内部引用当前执行上下文中的变量 用来优雅准确的告诉当前运行的函数所处的上下文环境 ...

  • js 闭包

    一、js 作用域 讲闭包首先就要理解 js 的作用域。再 ES5 中,js 有两种作用域,全局作用域和函数作用域(...

  • js第一篇

    【js的作用】 《欣赏js》 Js作用有如下几条: 1.制作网页中的功能; ​2.制作网页中的动画; ​3.制作网...

  • ES5中JS的作用域和变量提升(hoisting)

    ES5 中JS 的作用域: 在ES5 中,JS 只有两种形式的作用域:全局作用域和函数作用域。 全局作用域全局对象...

  • js作用域

    title: js作用域详解date: 2019-03-15 09:45:23tags: js 变量作用域 js中...

  • JavaScript快速上手:关于闭包的知识分享

    JS中变量的作用域 在理解闭包之前,我们得弄清楚JS中变量的作用域原理,它分为全局作用域和局部作用域,它有一...

  • JavaScript快速上手:关于闭包的知识分享

    01 JS中变量的作用域 在理解闭包之前,我们得弄清楚JS中变量的作用域原理,它分为全局作用域和局部作用域,它有一...

  • 干货!月薪80k前端大佬面试笔记:JS闭包解析!

    三点注意事项 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域)。 JS中的作用域链,内部的作用域可以访...

  • 2020-05-15 浅谈js中的闭包

    一、情景引入: 关于js的作用域,我们都知道: 1.js的作用域分两种,全局和局部 2.在js作用域环境中访问变量...

网友评论

      本文标题:JS中this的作用

      本文链接:https://www.haomeiwen.com/subject/dukmqltx.html