JavaScript中的this原理及6种常见使用场景详解

来源:脚本之家  责任编辑:小易  

中分中长发  在这个秋高气爽的季节里,长发妹子们终于可以毫无顾虑的享受长发飘飘的感觉了,而推荐的这一款黑色中长发,可清纯可帅气又能hold住百变气质,而中分设计更是能为UP气质。齐肩发型  空气刘海搭配披肩的齐肩发型还蛮建议妹子留的,整个发型设计尽显妹子甜美气质,而且还能起到很好的减龄与修饰脸型作用。锁骨发发型  今天大火的锁骨发型也推荐给大家,像这样半长不短的锁骨发加大波浪卷发,既成熟又很时髦。再染上闷青色发色,那更是透着一种低调奢华感,可美腻了。偏分长发  御姐必备的偏分长发绝对是秋季流行发型中不可缺少的,不对称设计让脸型显瘦,搭配金棕色发色时髦度翻倍,这样美美的长发你是否喜欢呢?内扣短发

一、this原理

谢邀。说起板凳匪徒,留给专篮印象最为深刻的一名球员就属鲍比-杰克逊了。而原因自然在于那支国王队了不起的“板凳匪帮了”。如果单纯说超级替补,NBA历史上不乏厉害的角色,吉诺比利,克劳福德,巴博萨,特里等人都是个中翘楚,其中克劳福德更是三次荣获年度最佳第六人,甚至有人建议将年度最佳第六人奖更名为贾马尔-克劳福德奖。但是要说板凳匪徒或者板凳匪帮,那首选一定是上世纪末的那支萨克拉门托国王队和他们的替补群了。1999年在4支球队流浪过后,生涯表现平平的琼-巴里来到了国王队,在这里开始重新开始了自己的职业生涯。原本他也对自己的前途没有什么信心,因为这里已经有7个后卫了,7个后卫争两个上场位置,这对前一个赛

this是JavaScript的一个关键字,函数调用时才会出现;

华为支持超级快充的手机除了Mate9系列,包括Mate9、Mate9Pro,还有P10系列,也就是P10、P10Plus,最大功率22.5W。超级快充(SuperCharge),是华为在Mate9上首次引入的快充技术,充电电压3.5-5V、电流4.5A,最高功率达22.5W,同时也支持4.5V/5A车载快充,当时是业内充电电流最高的方案。同时,华为超级快充技术也兼容之前的9V/2A、5V/2A充电器和充电线,还支持USBPD协议,PD类充电器都能给Mate9快充。但是,这个技术是华为私有的,和其他家的快充不兼容,必须搭配华为自己的充电头和数据线,充电宝也必须是华为的特定款式才能支持。按照华为的

因为函数是在一定的环境中运行的,调用函数时肯定需要知道是[谁调用的]?就用到了this进行指向;

香菜做为评价两极分化最严重的食材之一。不喜欢它的人对它嗤之以鼻,甚至有人表示香菜的味道闻起来像是这个香菜英文名字的词根是“臭虫”可想而知它的味道对于某些人来说有多可怕。不过,根据科学家的研究表示,不爱吃香菜完全是因为基因导致的而全世界大约有15%的人是讨厌香菜的。经科学研究发现,主要是因为这类人群有“OR6A2”这个嗅觉基因,这种基因能够很敏锐地接收到香菜里的醛类物质,也就是香菜特殊味道的来源。这个“OR6A2”离我们生活中肥皂的味道特别接近,所以天生不爱吃香菜的人。就直接感觉香菜有一股肥皂的味道,这让他们觉得香菜闻起来的味道很恶心。甚至世界上还有人成立了“反香菜联盟”如今人数已经超过5

那么this到底指向的是什么?

this 既不指向函数自身,也不指函数的词法作用域,而是调用函数时的对象!

二、使用场景

(一)普通函数的调用,this指向的是Window

var name = '卡卡'; function cat(){ var name = '有鱼'; console.log(this.name);//卡卡 console.log(this);//Window {frames: Window, postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, …} } cat();

这里大家可能有疑问,不是说this指向的是调用函数的对象吗?cat()并没有对象出现啊,这个是因为在全局作用域中,window是根目录,一般可以省略,例如:alert()其实是 window.alert();

(二)对象的方法,this指的是该对象

1、一层作用域链时,this指的该对象

var name = '卡卡'; var cat = { name:'有鱼', eat:function(){ console.log(this.name);//有鱼 } } cat.eat();

因为函数eat是由cat对象调用的,所以this指向的是cat本身,所以cat.name=有鱼;

2、多层作用域链时,this指的是距离方法最近的一层对象

var name = '卡卡'; var cat = { name:'有鱼', eat1:{ name:'年年', eat2:function(){ console.log(this.name);//年年 } } } cat.eat1.eat2();

eat2方法包含在两个对象cat、eat1中,但是紧挨着的eat1对象,所以this.name指的是eat1的属性name,即[年年]

这里需要注意一个情况,如果cat.eat1.eat2这个结果赋值给一个变量eat3,则eat3()的值是多少呢?

var eat3 = cat.eat1.eat2; eat3(); // 卡卡

答案是[卡卡],这个是因为经过赋值操作时,并未发起函数调用,eat3()这个才是真正的调用,而发起这个调用的是根对象window,所以this指的就是window,this.name=卡卡

(三)构造函数的调用,this指的是实例化的新对象

var name = '卡卡'; function Cat(){ this.name = '有鱼'; this.type = '英短蓝猫'; } var cat1 = new Cat(); console.log(cat1);// 实例化新对象 Cat {name: "有鱼", type: "英短蓝猫"} console.log(cat1.name);// 有鱼

(四)apply和call调用时,this指向参数中的对象

var name = '有鱼'; function eat(){ console.log(this.name); } var cat = { name:'年年', } var dog = { name:'高飞', } eat.call(cat);// 年年 eat.call(dog);// 高飞

apply方法和call方法相当于改变了显式的修改了prototype原型

(五)匿名函数调用,指向的是全局对象

var name = '卡卡'; var cat = { name:'有鱼', eat:(function(){ console.log(this.name);//卡卡 })() } cat.eat;

这里提一下匿名函数调用方式,常用的有三种方法:

//①先用()包起来,然后再后面跟 (参数) (function(data){ console.log(data); })("222"); //②先后面跟(参数),然后再()包起来 (function(data){ console.log(data); }("333")); //③正常函数格式,前面加 ! !function(data){ console.log(data); }("444");

(六)定时器中调用,指向的是全局变量

常用的定时器有setInterval和setTimeout,拿setInterval举例子:

var name = '卡卡'; var cat = setInterval(function(){ var name = '有鱼'; console.log(this.name);// 卡卡 clearInterval(cat); },500);

其实定时器的本质,也是一种匿名函数的形式。

总结:

①普通函数的调用,this指向的是window

②对象方法的调用,this指的是该对象,且是最近的对象

③构造函数的调用,this指的是实例化的新对象

④apply和call调用,this指向参数中的对象

⑤匿名函数的调用,this指向的是全局对象window

⑥定时器中的调用,this指向的是全局变量window

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

JavaScript 里的闭包是什么?应用场景有哪些

先介绍一个概念——生命周期,注意,不是简单的「作用域」,不是简单的两个花括号之间。

生命周期是从对象被声明开始,到对象被销毁结束(被GC回收)。

例如下面代码:

function extent(){

var n =0;

return function(){ n++; console.log(“n=”+n);

}

f=extent(); f(); f();

运行结果是 n=1 n=2

从结果来看n在第一次被调用之后并没有被销毁,理论上讲脱离了外层的extent()就应该销毁了。这是因为这个n被匿名函数对象封闭了,匿名函数被f引用所以不是垃圾,外部局部变量被匿名函数对象封闭之后也不是垃圾,所以生命周期被延长。当匿名函数成为垃圾之后,n才会销毁。

,Closure,就是封闭的意思。被封闭的对象的寿命和封闭它的函数相同。Javascript有真正的闭包特性,这应该能解释你提到的所有问题了。

另外,闭包特性能将函数和对象「结合」在一起。面向对象就是将对象和函数结合,就像一件事的正反两面,可以相互实现。闭包是实现面向对象的重要基础。

js中call,apply和bind方法的区别和使用场景

1、call,apply和bind的区别

它们在功能上是没有区别的,都是改变this的指向,它们的区别主要是在于方法的实现形式和参数传递上的不同。call和apply方法都是在调用之后立即执行的。而bind调用之后是返回原函数,需要再调用一次才行,

2、①:函数.call(对象,arg1,arg2....)

②:函数.apply(对象,[arg1,arg2,...])

③:var ss=函数.bind(对象,arg1,arg2,....)

3、总结一下call,apply,bind方法:

a:第一个参数都是指定函数内部中this的指向(函数执行时所在的作用域),然后根据指定的作用域,调用该函数。

b:都可以在函数调用时传递参数。call,bind方法需要直接传入,而apply方法需要以数组的形式传入。

c:call,apply方法是在调用之后立即执行函数,而bind方法没有立即执行,需要将函数再执行一遍。有点闭包的味道。

d:改变this对象的指向问题不仅有call,apply,bind方法,也可以使用that变量来固定this的指向。

JavaScript 里的闭包是什么?应用场景有哪些

闭包是:指有有访问另一个函数作用域中的变量的函数。

 创建闭包的常用方式:在一个函数内部创建一个函数。例子:

functioncreateFunction(name){

    return function(obj1, obj2){

        var value1 = obj1[name];

        var value2 = obj2[name];

       

        return value1 + ", " +value2;

    }

}

了解创建作用域以及作用域有什么作用的细节,对彻底理解闭包到头重要。当某个函数被调用时,会创建一个执行环境及相应的作用域链。然后,使用arguments和其他参数的值来初始化函数的活动对象

一、闭包

1、createFunction()创建时,它(compare)的作用域包含createFunction()函数的活动对象和全局对象。

//创建函数

var compare = createFunction("name");

console.log(typeofcompare);  //function

2、匿名函数被执行时,创建自己的活动对象和可以访问createFunction()的执行环境。

//调用函数

var result =compare({name: "jjaiy"}, {name:"ascy"});  //jjaiyy, ascy

3、createFunction()函数执行完后,其执行环境的作用域不会被销毁。原因在于它的活动对象还在内存中,直到匿名函数被销毁。

//解除对匿名函数的引用(以便释放内存)

compare = null;

原因在于:

浏览器的垃圾收集方式有:

  • 标记清除(主要针对变量)

  • 引用计数(跟踪记录每个值被引用的次数)

二、实例运行

封装功能var route = {

         routes: {},

         for: function(path, handler){ //闭包

                   this.routes[path] = handler;  //引用回调函数

         }

};

//执行二个匿名函数

route.for("/start",function(request, response){

         response.writeHead(200,{"Content-Type": "text/plain"});

         response.write("Hello");

         response.end();

});

 

route.for("/finish",function(request, response){

         response.writeHead(200,{"Content-Type": "text/plain"});

         response.write("Goodbye");

         response.end();

});

//先判断argument中的path变量是否一致,能否调用其函数中的回调函数。

if(typeof route.routes["/finish"] === 'function'){

        route.routes["/finish"](request, response);

    }

JavaScript 里的闭包是什么?应用场景有哪些

1、什么是闭包

闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包的特点:

  1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。

  2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

  简单的说,Javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。

 

2、闭包的几种写法和用法

首先要明白,在JS中一切都是对象,函数是对象的一种。下面先来看一下闭包的5种写法,简单理解一下什么是闭包。后面会具体解释。

//第1种写法  

function Circle(r) {  

      this.r = r;  

}  

Circle.PI = 3.14159;  

Circle.prototype.area = function() {  

  return Circle.PI * this.r * this.r;  

}  

  

var c = new Circle(1.0);     

alert(c.area());

/第2种写法  

var Circle = function() {  

   var obj = new Object();  

   obj.PI = 3.14159;  

     

   obj.area = function( r ) {  

       return this.PI * r * r;  

   }  

   return obj;  

}  

  

var c = new Circle();  

alert( c.area( 1.0 ) ); 


  • 本文相关:
  • js中的this关键字详解
  • javascript this用法小结
  • js中的this变量的使用介绍
  • javascript中this的四种用法
  • 改变javascript函数内部this指针指向的三种方法
  • 关于js里的this关键字的理解
  • javascript this关键字使用分析
  • javascript中this详解
  • js函数this的用法实例分析
  • javascript this指针
  • js原生态函数中使用jquery中的 $(this)无效的解决方法
  • js快速与任意qq号码建立临时对话
  • 微信小程序scroll-view实现字幕滚动
  • js使用正则表达式判断输入框失去焦点事件
  • javascript通过代码调用flash显示的方法
  • js简单实现表单中点击按钮动态增加输入框数量的方法
  • layui.use模块外部使用其内部定义的js封装函数方法
  • js onload处理html页面加载之后的事件
  • javascript 扩展运算符用法实例小结【基于es6】
  • 基于javascript 显式转换与隐式转换(详解)
  • javascript验证visa和mastercard信用卡号的方法
  • JavaScript 里的闭包是什么?应用场景有哪些
  • js中call,apply和bind方法的区别和使用场景
  • JavaScript 里的闭包是什么?应用场景有哪些
  • JavaScript 里的闭包是什么?应用场景有哪些
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved