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

js前端this指向规则

一言以蔽之:

  • this只和调用方式(调用者)有关
  • this是在运行时被绑定的

直接调用

当函数直接调用时,this指向的是window

      function foo() {console.log(this)}foo()

打印结果:
[object Window]

隐式绑定(对象)

当函数是以对象调用时,打印的是调用的对象

      function foo() {console.log(this)}var obj1 = {name: "obj1",foo: foo}obj1.foo()

打印结果:
{
“name”: “obj1”
}

显式绑定(call/apply/bind)

分为call/apply和bind

      function foo(name,age) {console.log(this,name,age)}var obj1 = {name: "obj1",foo: foo}foo.call(obj1,'zhangsan',18)foo.apply(obj1,['zhangsan',18])var bar = foo.bind(obj1,'zhangsan',18)bar()

执行结果:
在这里插入图片描述

new关键字绑定this

首先要清楚,new调用流程:(通过new关键字创建一个新对象的步骤是什么/构造函数时如何创建新对象的)

  • 创建一个新的对象
  • 空的对象的__proto__属性指向构造函数的Prototype属性(原型链)
  • 执行构造函数,如果构造函数中有this,则将this指向这个对象
  • 返回创建的对象
      function foo(name) {console.log(this) // foo{}this.name = name // foo{name:'obj1'}}var obj1 = new foo('obj1')

优先级

new>显式>隐式

经典面试题分析1

		// 错误的题目function foo(){console.log(this)}var obj1 = {name:'obj1',foo: foo}var obj2={name:'obj2'}// 错误原因在这里没有分号// 由js的自动分号插入(ASI)导致// 参考:https://juejin.cn/post/7325243117861519370(obj2.foo = obj1.foo)()

报错:
index.html:21 Uncaught TypeError: Cannot set properties of undefined (setting ‘foo’)
at index.html:21:19
(anonymous) @ index.html:21

正确的题目

        function foo(){console.log(this)}var obj1 = {name:'obj1',foo: foo}var obj2={name:'obj2'}; // 这里有分号(obj2.foo = obj1.foo)()

结果:
window
这里的(obj2.foo = obj1.foo)()等价于foo(),显然属于直接调用,打印window

参考:https://juejin.cn/post/7325243117861519370

经典面试题分析2

        var name = '全局window'var person = {name: 'person',sayName: function(){console.log(this.name)}}function sayName(){var fun = person.sayNamefun() // windowperson.sayName();(b = person.sayName)()}sayName()

结果:
在这里插入图片描述
这里还有个注意点,当我们不声明name这个变量,window.name这个也是存在的,默认是一个空字符串。
并且,如果你①先运行上面这段代码,②再把var name = '全局window’这句注释,③刷新页面,会发现还是显示全局window而不是空字符串!这里的原理是:
window.name是一个所有浏览器都有的属性,表示浏览器窗口的名称,默认是一个空字符串,所有浏览器都是个空字符串。
window.name有个很有意思的跨页面特性,具体描述为:页面如果设置了window.name,即使进行了页面跳转到了其他页面,这个window.name还是会保留,刷新也是。

可以参考:https://www.zhangxinxu.com/wordpress/2019/09/window-name/

http://www.dtcms.com/a/509072.html

相关文章:

  • 怎样申请免费网站wordpress 360收录
  • 深圳网站制作公司排名网站建设报班
  • 算命网站开发电话汉服网站的建设
  • 前端-Vue3项目创建以及初始化
  • 网站建设用户登录源码科技小发明小制作
  • 网站设计的大公司上海it驻场服务外包
  • C++:STL--》 mapset以及multsetmultmap的使用
  • 织梦网站建设实训心得黄金网站软件入口免费
  • 01-Kubernetes基本操作
  • 山东网络建站推广我想做电商怎么做
  • 商品网站开发需求表优质的响应式网站建设
  • 操作系统面经1——进程管理
  • 中山微网站建设报价重庆网站建设 重庆网站制作
  • 做视频网站需要什么软件有哪些云电脑免费版永久使用
  • 常州城乡建设局网站网站最新程序策划书
  • 环保局网站建设申请网络游戏名字
  • 阿里Qoder 【新手一小时0-1开发前后端系统】附详细过程
  • 网络营销型网站策划中国软件是外包公司吗
  • 网站建设与管理怎么做塘沽网站优化
  • DeepSeek-AI团队开源的DeepSeek-OCR模型
  • 上海建筑网站建设wordpress添加活动
  • 笔试-模拟打印
  • 中堂东莞网站建设网站界面设计中的版式设计有哪些
  • missionplanner飞行模式参数调参释义一览
  • 撰写网站建设策划书范文专业制作结婚证
  • Pangolin安装记录
  • 网站seo排名优化价格附近的广告公司电话
  • 手机上的应用商店seo做多个网站
  • wordpress表单统计插件西安seo排名扣费
  • 二级网站有什么好处网站怎么做移动适配