'.'
点操作符的话,函数体中的 this
就指向前面的对象,没有就指向 window
,严格模式下指向 undefined
。这句话特别的重要,请记住this
指向全局对象(浏览器中是window,node中是 global)。如匿名函数等this
指向实例本身。this
的,箭头函数的 this
指向最近的非箭头函数 this
,找不到就指向 window
,严格模式下指向 undefined
。再来看一下这句话:执行函数前有
'.'
点操作符的话,函数体中的this
就指向前面的对象,没有就指向window
var name = '林一一'
function fn(){
var name = '林二二'
return this.name
}
fn() // 林一一
复制代码
执行函数
fn()
,前面没有'.'
点操作符吧,那么这里的this
就指向window
。输出的就是全局下的name = '林一一'
。
再来看一下这句话:执行函数前有 '.'
点操作符的话,函数体中的 this
就指向前面的对象,没有就指向 window
var name = '林二二'
var obj = {
name: '林一一',
fn: function () {
return this.name
}
}
console.log(obj.fn()) // '林一一'
var fo = obj.fn
console.log(fo()) // '林二二' fo() ==> window.fo()
复制代码
obj.fn()
中函数fn()
前面有'.'
点操作符吧,那么这里的this
就指向obj
这个对象。再看执行函数fo()
,前面没有'.'
点操作符吧,那么这里的this
就指向window
。其实上面的函数fo() ==> window.fo()
,所以执行函数fo()
前面也是可以看作是有'.'
操作符的。
再来看一下这句话:执行函数前有 '.'
点操作符的话,函数体中的 this
就指向前面的对象,没有就指向 window
var name = '林二二'
var obj = {
name: '林一一',
fn: function () {
var name = '小三'
return function(){
return this.name
}
}
}
console.log(obj.fn()()) // 林二二
var fo = obj.fn()
console.log(fo()) // 林二二
复制代码
热身3和热身2差不多,
obj.fn()()
中obj.fn()
执行完后有一个函数(这里称为函数A
)返回,最后相当于执行函数A()
,A()
前面没有'.'
点操作符吧,那么这里的this
就指向window
,输出就是林二二
了。上面的fo()
函数同理。
函数没有直接调用者 this
指向全局对象(浏览器中是window,node中是 global),如匿名函数等;严格模式下指向 undefined
var name = '林一一';
!(function(){
console.log(this.name) // 林一一
})()
复制代码
自执行函数没有直接的调用者输出的
name = '林一一'
。
var name = '林一一'
var obj = {
name : '二二',
callback: function(){
console.log(this.name)
}
}
setTimeout(obj.callback,1000)
/* 输出
* 林一一
*/
复制代码
函数
setTimeout
,obj.callback(这只是一个引用地址)
中并没有直接调用者,this
就指向window
。所以输出的name
就是全局下的林一一
。
来读一下这句话:构造函数的 this
指向实例本身
关于构造函数的
this
为什么指向实例是浏览器指定的,详情看new
这个过程发生了什么 面试 | 你不得不懂得 JS 原型和原型链
function Fn(){
var n = 0
this.name = '林一一'
this.age = 18
this.getName = function(){
return this.name
}
}
Fn.prototype.getAge = function(){
return this.age
}
Fn.x = '林二二'
var f = new Fn()
console.log(f.name) // 林一一
console.log(f.getName()) // 林一一
console.log(f.getAge()) // 18
console.log(f.n) // undefined
console.log(f.x) // undefined
复制代码
上面的
Fn
经过new
后就是一个构造函数,this
就指向实例f
。所以上面的1,2输出都是林一一
。f.getAge()
是实例f
调用了getAge
输出就是 18,问:实例f
中并没有属性getAge
是怎么输出 18的,f.x
输出又为什么是undefined
?答:这是原型链的查找机制,属性x
不是在原型prototype
上的就不是实例的属性,可以读一下这篇文章 面试 | 你不得不懂得 JS 原型和原型链;问:为什么f.n
输出的是undefined
。因为变量n
是构造函数的私有变量和new
创建的实例没有关系。
this
,箭头函数的this
继承上下文的,里面的 this
会指向当前最近的非箭头函数的 this
,找不到就是 window
(严格模式是undefined)var name = '林一一'
var obj = {
name: '二二',
a: () => {
console.log(this.name)
}
}
obj.a()
/* 输出
* '林一一'
*/
复制代码
箭头函数的
this
,找不到非箭头函数的this
就直接指向window
。
var name = '林一一'
var obj = {
name: '二二',
fn: function() {
return () => {
console.log(this.name)
}
}
}
obj.fn()()
/* 输出
* '二二'
*/
复制代码
很明显箭头函数的
this
来自函数fn
,对象obj
调用了函数fn
,所以fn
的this
指向obj
,输出结果就是二二
。
提示:所有的函数都是基于 Function
这个基类来创建的,同样拥有 Function
原型上面的方法
call
,接受this
的对象,和一组列表。apply
和 call
一样,唯一不同的是 apply
接受的是一个包含多个参数的数组。bind
同样也是改变函数的 this
指向,只不过 bind
执行后会返回一个新的函数,新函数中参数来源于剩余的参数var name = '林一一'
var age = 18
function fn(){
return this.name
}
function p(){
return {
age: this.age,
arg: arguments
}
}
let obj = {
name: '二二',
age: 18
}
let o = {
name: '三三'
}
fn() // '林一一'
fn.call(obj) // '二二'
fn.call(o) // '三三'
p.call(obj, 12, 23, 45, 67) // {age: 18, arg: Arguments(4)}
fn.apply(obj) // "二二"
p.apply(obj, [1, 2, 3, 4, 5]) // {age: 18, arg: Arguments(5)}
fn.bind(obj)() // "二二"
p.bind(obj, 12, 23, 34)() // {age: 18, arg: Arguments(3)}
复制代码
以上就是
call
,apply
,bind
, 关于this
的内容,这里不介绍三者的写法,如果介绍可以写另一篇文章了。对这三者不熟悉的可以找其他资料看看。
var name = '林一一'
var obj = {
name: '林二二',
show: function (){
console.log(this.name)
},
wait: function () {
var fn = this.show
fn()
}
}
obj.wait() // 林一一
复制代码
obj.wait()
中,执行函数wait()
前面有'.'
点操作符吧,那么这里的this
就指向obj
这个对象,所以this.show ==> obj.show
。再看执行函数fn()
前面没有'.'
点操作符吧,那么这里的this
就指向window
,输出就是林一一
。
new 创建函数的过程中发生了什么可以看这篇 面试 | 你不得不懂得 JS 原型和原型链
function Foo() {
Foo.a = function() {
console.log(1)
}
this.a = function() {
console.log(2)
}
}
Foo.prototype.a = function() {
console.log(3)
}
Foo.a = function() {
console.log(4)
}
Foo.a();
let obj = new Foo();
obj.a();
Foo.a();
/*
* 4
* 2
* 1
*/
复制代码
Foo.a();
中直接调用函数的私有方法a
输出结果就是 4。new Foo();
过程中函数的私有a
被重新赋值,同时原型prototype
上的属性a
也被重新赋值。所以obj.a();
输出结果就是 2,Foo.a();
输出结果就是 1。
var n = 2 // -> 4 -> 8
var obj = {
n: 3, // 6
fn: (function(n){
n*=2
this.n+=2 // window 下的 n 变成 4
var n = 5 // 这一步不会再重新声明,因为已经参数赋值,就不会再声明而是直接赋值 n = 5
console.log("window.n", window.n)
return function (m) {
console.log("n:", n, "m", m) // n:5 m:3 这里的 n 向上查找是 5 //
this.n*=2 // fn(3): 2 * 4 =8 // obj.fn(3): 2 * 3 = 6
console.log(m + (++n)) // 3 + (++5) ++n 导致上级作用域的n变成了6 // 3 + (++6)
}
})(n)
}
var fn = obj.fn;
fn(3) // 9
obj.fn(3) // 10
console.log(n, obj.n) // 8 6
/* 输出
* 9
* 10
* 8 6
/
复制代码
这道题就留给大家思考了,上面有我的分析步骤,觉得碍眼的话可以去掉 。你可以在评论区给出你的分析过程。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/jBRKaIZ1scCQQNVn4u-F2w
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。