当前位置: 首页 > wzjs >正文

为中国移动做网站的公司叫什么陕西省住建厅官网

为中国移动做网站的公司叫什么,陕西省住建厅官网,河北高端网站制作,seo 优化一个月费用文章目录 默认绑定 / 隐式绑定如何调整this1.用变量固定this2.箭头函数2.bind3.call/apply(一次性) 默认绑定 / 隐式绑定 要找this指针指向谁,我们首先要做的是:找到一个明确的对象,这个对象调用了含有this指针的函数…

文章目录

  • 默认绑定 / 隐式绑定
  • 如何调整this
    • 1.用变量固定this
    • 2.箭头函数
    • 2.bind
    • 3.call/apply(一次性)

默认绑定 / 隐式绑定

要找this指针指向谁,我们首先要做的是:找到一个明确的对象,这个对象调用了含有this指针的函数,则:
谁调用函数,this指向谁。

而如果找不到,this 默认指向全局对象(浏览器中是 windowNode.js 中是 global)。
以下面几个例子说明一下:

const obj = {name: 'Alice',Hello: function() {console.log(this.name);}
};obj.Hello(); // 输出 "Alice" - this 指向 obj

这个例子中的this指针所属函数为Hello,谁调用了Hello()?是obj,所以this.name就是要在obj中找到name


const obj = {name: 'Alice',Hello: function() {console.log(name);}
};const obj1 = {};
obj1.name = 'Joan';
obj1.Hello = obj.Hello; 
obj1.Hello();// 输出 "Joan" - this 指向 obj1

这里调用Hello的对象成了obj1,自然地,name就需要找obj1中的了。


function test() {console.log(this.x);
}var obj = {};
obj.x = 1;
obj.m = test;obj.m(); // 1

在这个例子中,this指针所属函数为test, test赋值m,此时mtest指向同一个函数,那么obj调用m()就等同于调用test()this.x就是要在obj中找到那个x。其实和上一个例子本质上大差不差。

要是我们换一种方法呢?


function test() {console.log(this.x);
}
test();// 非严格模式:可能输出 undefined// 严格模式:报错(Cannot read property 'x' of undefined)

这个时候我们会发现找不到谁调用了test,这就遵循默认绑定规则,this 会默认绑定到全局对象(非严格模式)或 undefined(严格模式)。
当然,这是因为我们把test绑定到了全局,并且非要在全局没有x的情况下找出一个x。
那么如果我们不找那个x呢?


function test() {console.log(this);
}
test(); // 输出 window 对象

此时,在非严格模式下会输出window,在严格模式下,this 还是undefined
这是删掉.x的情况,但这样改显然不符合这个函数原先的想法。那么如果我们依然把this指向全局,并且在全局中给他一个x呢?


let x = 1;
function test() {console.log(this.x);
}
test(); // 1

这时候就会输出全局中的x。


let x = 1;
function test() {return this.x;
}
console.log(test());  //1

当然换一种方式也是一样的。


function test() {return this;
}
function test1(func) {func();
}test1(test())  //window

在这个例子中,test函数以参数的形式被调用,有没有那么一个明确的对象调用了test呢?我们找不到这个调用者,所以this指针指向window


其他情况:

除了上面的情况,还有一些情况可以拎出来单独说一下,我们回到第一个例子,给它额外加个定时器:

const obj = {name: 'Alice',Hello: function() {setTimeout(function(){    console.log(this.name);})}
};obj.Hello(); // undefined(非严格模式)或 报错(严格模式)

现在我们的this所属函数是setTimeout,但是是谁调用了它呢?我们找不到了。也就是说这种情况下,this 会丢失原来的绑定,默认指向全局对象。而全局中找不到name

定时器中的回调函数的this指针总是指向window对象


如何调整this

出现上面的this 丢失原来的绑定的情况不是我们希望看到的,那么有没有什么办法能按照原本的想法输出呢?

1.用变量固定this

const obj = {name: 'Alice',Hello: function() {let that = this;setTimeout(function(){    console.log(that.name);})}
};obj.Hello(); // "Alice"

我们用一个额外的变量先把this固定下来,下面再利用这个变量进行操作就可以了。

2.箭头函数

箭头函数没有自己的 this,它会捕获所在上下文的 this 值。所以我们可以这么写:

const obj = {name: 'Alice',Hello: function() {setTimeout(() => {    console.log(this.name); // this 继承 Hello 的 this(即 obj)}, 0);}
};
obj.Hello(); // 输出 "Alice"

可以想象箭头函数就是把它所在的那个函数趟平了setTimeout现在不是一个拦路石了,它变成了单纯的“一条路”,那我们直接往上走就好,现在this通往的函数就是Hello

2.bind

如果不方便用变量固定this,箭头函数也不太合适呢?
比如这种情况:

class Person {constructor(){this.name = "Alice";}getName(){return this.name;}
}let change = {name: "Joan"
}let a = new Person()
change.getName = a.getName
console.log(change.getName())  //"Joan"

这种情况下,如果我们想要this.name始终为"Alice",就可以使用bind了,bind的意义指定一个this的指定对象,可以在于返回一个始终指向该对象的值。

class Person {constructor(){this.name = "Alice";this.getName = this.getName.bind(this);}getName(){return this.name;}
}let change = {name: "Joan"
}let a = new Person()
change.getName = a.getName
console.log(change.getName()) //"Alice"

我们添加了一句代码:

this.getName = this.getName.bind(this);

为了便于理解,我们可以把它看成

function1 = function.bind(this)

意思就是,我给你一个function1 ,这个方法是我把function和一个this指向绑定到了一起,从今往后你在任何地方调用function1 ,它的指向永远固定,而回到情境中,function1是this.getName,function也是this.getName,也就是说,我们给this.getName重新赋值了一下。现在它永远指向Alice了。

为了加深理解,我们可以多看一个例子:

function Hello() {console.log(this.name);
}const person = { name: 'Bob' };const BobHello = Hello.bind(person);
BobHello();         //  输出"Bob"

这个会容易理解一点是不是?

3.call/apply(一次性)

既然提到了bind,就不得不提一下call/apply了。他们的作用相似,但有一些微妙的差别,比方说bind并不会立即执行,但这两个会,并且他们是一次性的,不能接收,如下:

function Hello() {console.log(this.name);
}const person = { name: 'Bob' };Hello.call(preson);  //  输出"Bob"
Hello.apply(preson); //  输出"Bob"
const BobHello = greet.bind(person);
BobHello();         //  输出"Bob"

而call和apply的区别如下:

  1. apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入
    当参数是动态数组时,apply 比 call 更方便。
    改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次
function fn(...args){console.log(this,args);
}
let obj = {myname:"张三"
}fn.apply(obj,[1,2]); // this会变成传入的obj,传入的参数必须是一个数组;
fn(1,2) // this指向window

当第一个参数为null、undefined的时候,默认指向window(在浏览器中)

fn.apply(null,[1,2]); // this指向window
fn.apply(undefined,[1,2]); // this指向window
  1. call方法的第一个参数也是this的指向,后面传入的是一个参数列表(逐个传入)
    call 通常更快,因为 apply 需要处理数组。
    跟apply一样,改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次
function fn(...args){console.log(this,args);
}
let obj = {myname:"张三"
}fn.call(obj,1,2); // this会变成传入的obj,传入的参数必须是一个数组;
fn(1,2) // this指向window

同样的,当第一个参数为null、undefined的时候,默认指向window(在浏览器中)

fn.call(null,[1,2]); // this指向window
fn.call(undefined,[1,2]); // this指向window
http://www.dtcms.com/wzjs/817547.html

相关文章:

  • 微信推广和网站推广哪个好搭建网站的软件有哪些
  • 做网站做推广有效果吗织梦网站后台模版更换
  • 做电商网站的大连网站建设lccm
  • 成都工业学院文献检索在哪个网站做企业邮箱域名
  • 淘宝网站开发多少金额网站建设背景及意义
  • 专业东莞网站建设报价即在市场中确立自己的位置
  • 网站建设需要具备哪些西安网站搭建的公司
  • 微信小程序 网站开发如何建设网站吸引人
  • 商业网站策划方案网站建设那些公司比较好
  • 编辑网站教程网站用wordpress还是wp
  • 做个网站需要学会什么中信建设四川分公司招聘
  • 农家乐网站模板苏州钻木网络科技有限公司
  • 北京一家专门做会所的网站网页版游戏排行榜女
  • 做网站如何与腾讯合作机械网站建设比较好的
  • 网站 建设 步骤是邮箱注册申请官网
  • 做网站和seo流程可以做自己的单机网站
  • 慈溪市网站开发访客浏览网站 网站怎么跟踪
  • 江门模板开发建站正保建工网校
  • 深圳wordpress外贸网站建设软件app开发定制
  • 网上做代卖的网站注册一个网站
  • 网站排行榜查询表白网页在线生成制作免费
  • 稻壳企业网站模板wordpress权限数字
  • 网站网页的优化方法陵县网站建设
  • 一个公司可以注册几个网站定制wordpress
  • wordpress导出网站金融公司网站开发
  • 外贸网站建站电话多少做盗版网站会怎样
  • 关键词seo排名怎么样网站维护运营优化公司
  • 做网站工作室建设银行采购网站
  • 宣威市住房和城乡建设局网站下载中心优秀的产品设计与分析
  • 免费com域名网站中山建设网站官网