最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • js的五种绑定

    正文概述 掘金(_jiang)   2021-08-22   437

    五种绑定

    方式:默认绑定、隐式绑定、显示绑定、new绑定、箭头函数绑定

    优先级:显式绑定 > 隐式绑定 > 默认绑定 new绑定 > 隐式绑定 > 默认绑定

    默认绑定

    function fn1() {
        console.log(this); //window
    };
    function fn2() {
        "use strict";
        console.log(this); //undefined
    };
    var name = '听风是风';
    function fn3() {
        console.log(this); //window
    };
    (function () {
        "use strict";
        fn3();
    }());
    

    隐式绑定

    1. 如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上

    function fn() {
        console.log(this.name);
    };
    let obj = {
        name: '听风是风',
        func: fn
    };
    obj.func() //听风是风
    

    2. 如果函数调用前存在多个对象,this指向距离调用自己最近的对象

    function fn() {
        console.log(this.name);
    };
    let obj = {
        name: '行星飞行',
        func: fn,
    };
    let obj1 = {
        name: '听风是风',
        o: obj
    };
    obj1.o.func() //行星飞行
    

    隐式丢失

    1. 作为参数传递以及变量赋值
    var name = '行星飞行';
    let obj = {
        name: '听风是风',
        fn: function () {
            console.log(this.name);
        }
    };
    function fn1(param) {
        param();
    };
    fn1(obj.fn);//行星飞行
    例子中我们将 obj.fn 也就是一个函数传递进 fn1 中执行,这里只是单纯传递了一个函数而已,this并没有跟函数绑在一起,所以this丢失这里指向了window。
    
    1. 变量赋值,其实本质上与传参相同
    var name = '行星飞行';
    let obj = {
        name: '听风是风',
        fn: function () {
            console.log(this.name);
        }
    };
    let fn1 = obj.fn;
    fn1(); //行星飞行
    

    3.隐式绑定丢失并不是都会指向全局对象

    var name = '行星飞行';
    let obj = {
        name: '听风是风',
        fn: function () {
            console.log(this.name);
        }
    };
    let obj1 = {
        name: '时间跳跃'
    }
    obj1.fn = obj.fn;
    obj1.fn(); //时间跳跃
    虽然丢失了 obj 的隐式绑定,但是在赋值的过程中,又建立了新的隐式绑定,这里this就指向了对象 obj1。
    

    显示绑定

    let obj1 = {
        name: '听风是风'
    };
    let obj2 = {
        name: '时间跳跃'
    };
    let obj3 = {
        name: 'echo'
    }
    var name = '行星飞行';
    
    function fn() {
        console.log(this.name);
    };
    fn(); //行星飞行
    fn.call(obj1); //听风是风
    fn.apply(obj2); //时间跳跃
    fn.bind(obj3)(); //echo ,因为bind非立即执行,详情参考笔记的this指向call,apply,bind
    
    let obj1 = {
        name: '听风是风'
    };
    let obj2 = {
        name: '时间跳跃'
    };
    var name = '行星飞行';
    function fn() {
        console.log(this.name);
    };
    fn.call(undefined); //行星飞行
    fn.apply(null); //行星飞行
    fn.bind(undefined)(); //行星飞行
    

    new绑定

    new执行了什么
    (1) 创建一个新对象
    (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象)
    (3) 执行构造函数中的代码(为这个新对象添加属性)
    (4) 返回新对象

    function Fn(){
        this.name = '听风是风';
    };
    let echo = new Fn(); //this将指向新对象echo上
    echo.name//听风是风
    

    箭头函数

    准确来说,箭头函数中没有this,箭头函数的this指向取决于外层作用域中的this,外层作用域或函数的this指向谁,箭头函数中的this便指向谁。


    起源地下载网 » js的五种绑定

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元