this指向问题(1)

在JS中,this一般有四种绑定的方式,但是在确定到底是哪种绑定之前必须先找到函数的调用位置。接下来先介绍其中的三种:

1、默认绑定

  其实所谓的默认绑定就是函数直接调用(前面没有什么东西来点它),在默认绑定的非严格模式中,this 指向 window

function test(){
        console.log(a)  // 1
    }
var a = 1
test()

在这个地方可能会有人想问,如果是在另一个函数 foo 中调用函数 test 呢 ? 其实 this 指向的还是 window 。可以这样想

test()=window.test()

2、隐士绑定

  故名思意“你没有看到在哪绑定的”,在这里要考虑的是调用的位置有没有上下文对象,或者是被对象包含之类的

function test(){
        console.log(this.a)
}
var obj = {
    a:1,
    text:test
}
test()  // undefined
obj.text()   // 1

在这个地方可能有人会想不通了。为什么 obj.text() 之后执行的确实函数 test ,其实在这个地方 属性 text 里面放的是函数 test 的引用。在这因为函数调用的上下文对象是 obj ,所以this 指向了 obj。如果有很多层引用,那么this 就是指向最后一个

var b = obj.text
var a = 2
b() // 2

在这个地方 b 其实是拿到了函数 test 的引用,所以还是遵循默认绑定。还有一个值得一提的地方是:向函数传递参数其实是一种隐形赋值,感兴趣的可以去试试

3、new 绑定

  说到 new 了解过 Java 的人应该都知道,但是 JS 中的 new 和 Java 中的不是一个东西。

new 的作用:

      1、构建一个全新的对象(注意是全新)

      2、新对象会绑定到函数调用的 this

      3、如果 new 的这个函数没有返回对象,那么new之后就会自动返回这个对象

        function test(a){
            console.log(this)   // test{}
            this.a=a
            console.log(this)   // test{a:2}

        }
        console.log(test) // f test(){}
        var b = new test(2)
        console.log(b.a)  //2

其实还可以在 test 函数里面返回一个对象,那样在 b 里面保存的就是这个返回对象

在这里涉及到了原型链就不讲了,等后面专门挑个时间好好写写原型链

其实关于 this 还有 call、apply、bind、箭头函数可写,但是在这就不写了。这个礼拜好好梳理一下这些东西,然后再分享出来,顺便会写到优先级的问题。

第一次写,不喜欢勿喷,如果有什么问题可以留言。我学JS是也从别人那学了很多东西,所以现在把我知道的分享出来,共同进步。2018年加油吧

原文地址:https://www.cnblogs.com/lan1974/p/8167922.html

时间: 2024-10-08 12:21:39

this指向问题(1)的相关文章

当this指针成为指向之类的基类指针时,也能形成多态

this指针: 1)对象中没有函数,只有成员变量 2)对象调用函数,通过this指针告诉函数是哪个对象自己谁. 1 #include<iostream> 2 using namespace std; 3 class Shape 4 { 5 public: 6 //void cal_display(Shape* this) 7 void cal_display(){ 8 display(); 9 this->display(); 10 } 11 private: 12 virtual vo

JavaScript中this指向

一.重点来了,this指向问题: 1.this指向之普通函数. 2.this指向之对象 3.this指向之构造函数 4.this指向之(call,apply)动态更改this指向. 二.具体分析如下 1.普通函数 // 第23行的调用者为null,this指向也为null,// 所以这时js把this指向了window对象,所以弹出的结果是// n,这样不好的是会污染全局函数内带this的操作,不能直接调用; 2.对象 // 第34行是对象的say方法指针指向了一个存在的函数say();// 所

Android gen根目录下自动生成的R文件指向问题

今天才弄明白,原来在调用vitamio包的时候使用它们的R文件,然后在迁入广告的时候出现了问题,但是瞎胡搞半天后把问题解决了,可没有明白这是什么原因. 今天更新应用又出现了相同的情况,无意中打开了gen的根目录妈蛋!发现里面的报名根本就不是我现在应用的包名.而是调用的那个工程的包名!这下终于找到根本原因了,但是怎么解决呢???----------->修改包名呗~~~~~~~可是你改了它又会自动生成了原来的那个,--------------后来终于发现原来这个R文件的包名适合manifest文件中

javascript中this的指向

作为一个前端小白在开发中对于this的指向问题有时候总是会模糊,于是花时间研究了一番. 首先this是JS的关键字,this是js函数在运行是生成的一个内部对象,生成的这个this只能在函数内部使用. 但是随着函数使用场合的不同,this的值会发生变化.有一个原则不会变,那就是this指的是,调用函数的那个对象. demo1: 此时函数运行的结果是 1 ,x是全局变量,因为匿名函数demo()是被window调用的,原始写法是window.demo(),因为demo()是被window调用的,所

了解Js中的this指向

Js中的this对象是在运行时基于函数的执行环境绑定的,其中的this指向很不好理解,一不小心就用错了位置;. this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象. 对于this指向的理解,我分以下几种情况来说, this的指向: 1.在全局函数中,this等于window: var name="cyp"; console.log(this); 2.当函数被用作为某个对象的方法调用时,this等于哪个对

sitecore+score 在 Experience editor 添加新元素时associateed content 指向错误

Q:在sitecore的Experience editor页面添加component时,子元素的路径指向错误.如图: A: 首先你要整理思路,这个设置可能是在哪,是template还是control layout.当然这里肯定是跟页面control有关. 1.我们需要找到这个button的control layout.因为我们的项目是集成了score,所以根据score的手册我们知道这个button的路径在/sitecore/layout/Renderings/BootstrapUI/Conte

成员函数指针和指向静态成员函数的指针

#include <iostream> using namespace std; class Student{ public:     Student(const string& name):m_name(name){}     void who(void){         cout << m_name << endl;     }     string m_name;     static int s_add(int a,int b){         re

JavaScript 中的this指向问题

全局执行     首先,我们在全局环境中看看它的 this 是什么:     浏览器:     console.log(this);     // Window {speechSynthesis: SpeechSynthesis, caches: CacheStorage, localStorage: Storage, sessionStorage: Storage, webkitStorageInfo: DeprecatedStorageInfo…}     可以看到打印出了 window 对

JavaScript闭包中闭包函数this的指向

阅读文章前, 请先阅读阮一峰老师的这篇文章http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 前人写过的, 而且写得很好, 就没必要重复下去了. 只加一些阮老师的文章里没有说的.顺便总结一下. 引用一句话: "闭包就是functions that return function"(出处已经忘记啦) 闭包的类型: 循环闭包, 函数闭包 闭包的特点: 外部访问函数内部的值, 函数内部变量不被回收

彻底理解js中this的指向

<script> //this指向的是最终调用它的那个对象 //this指向的是window function aa(){ var str = 'jack'; console.log(this.str); //undefined console.log(this); //window } window.aa(); //this指向的是bb var bb = { str : 'jack', show : function(){ console.log(this.str); //jack } }