WEB前端开发 Javascript---this指向

简介: WEB前端开发 Javascript---this指向

前言

本文讲解了WEB前端开发javascript的this指向基础,如果觉得对你有帮助请关注小编,你的支持就是我更新的动力!

以下是本篇文章正文内容,下面案例可供参考

一、javascript this

this作为js语言的一个关键字,表示函数运行时自动生成的一个内部对象,只能在函数内部使用。

情况1 :纯粹的函数调用

function test(){
  this.x = 1;
  alert(this.x);
}
test(); // 1
//为了证明this就是全局对象,对代码做一些改变
var x = 1;
function test(){
  alert(this.x);
}
test(); // 1
//再变
var x = 1;
function test(){
  this.x = 0;
}
test();
alert(x); //0

情况2 :作为对象方法调用

//函数还可以作为某个对象的方法调用,这时this就指这个上级对象。
function test(){
  alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1

情况3:作为构造函数调用

//所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象
function test(){
  this.x = 1;
}
var o = new test();
alert(o.x); // 1
//为了证明this不是全局对象,对代码做一些改变
var x = 2;
function test(){
  this.x = 1;
}
var o = new test();
alert(x); //2

情况4:apply/call调用

var x = 0;
function test(){
  alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0
//apply的参数为空时,默认调用全局对象。若有值,this指向该对象
o.m.apply(o); //1

最后看下几个较为复杂的例子,巩固下理解

//1
var name = "the window";
var object={
  name:"my object",
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
var func = object.getNameFunc();
console.log(func())//"the window"
//2
var name = "the window";
var object={
  name:"my object",
  getNameFunc : function(){
    var that = this;
    return function(){
      return that.name;
    };
  }
};
var func = object.getNameFunc();
console.log(func())//"my object"
//3
var name = "the window";
var object={
  name:"my object",
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
var obj = {};
obj.name = "obj name"
obj.func = object.getNameFunc();
console.log(obj.func());//"obj name"

二、Javascript This 指针指向问题

js中的this最终指向的是那个调用它的函数[this:谁调用它就指向谁]

首先看一下接下来的例子

例子一

function aa(){
       var men = "leon";
         console.log(this.men);//undefined
         console.log(this);//window
}
aa();

按照上面我们说的那样,this的最终指向的是调用它的对象,这里的函数aa实际上是最终指向的window,而window里面是没有men的,所以第一个是undefined,第二个则是window。

例子二

var bb ={ 
'men' : "leon",
 fn:function(){
 console.log(this.men)//leon 
}
 } 
bb.fn();
var bb ={ 
'men' : "leon",
 fn:function(){
      console.log(this.men)//leon 
} 
} 
window.bb.fn();

说明:这里的this指向的是对象bb,因为你调用这个fn是通过bb.fn()执行的。所以我们可以说明一点,this的指向在对象创建的时候是决定不了的,在调用的时候才能够决定,谁调用就指向谁

例子三

例子1:  
var name="The window";
      var object={
        name:"My object",
        getNameFunc:function(){ //递归
          return function(){
            return this.name;
          }
        }
      }
  alert(object.getNameFunc()());

This在找到一个变量的同时就不会往下找

例子2
      var name="The window";
      var object={
        name:"My object",
        getNameFunc:function(){ //递归
          var that=this;
          return function (){
            return that.name;
          }
        }
      }
  alert(object.getNameFunc()());

说明:
window是js中的全局对象,我们创建的变量实际上是给window添加属性,而一般情况我们经常省略window,所以这里可以用window.bb

例子四

var cc = {
 a:99,
     b:{
 a:100, 
fn:function(){
 console.log(this.a);//100
 }
 }
 }
 cc.b.fn();

这里的函数是由最外层的cc点出来的,但是this和上面一样并没有执行它,而是最终指向的b;所以我们可以推翻一开始说的那句话,并且总结如下:

情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window(但是这里需要说明的是js的严格版中this指向的不再是window,这个问题在这里不谈)。

情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,this指向的是就是它上一级的对象。

情况3:如果一个函数中有this,这个函数包含多个对象,尽管这个函数是被最外层的对象所调用,this也只是指向的它上一级的元素。

总结

1.函数在被直接调用的时候,其中的this指针永远指向window

2.匿名函数this总是指向window对象

3.谁执行函数,this就指向谁

4.如果函数通过new创建,则this指向新建出来的对象

关注

本文到这里就结束了,如果你觉得本文对你有帮助,请三连支持博主!

目录
相关文章
|
21天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
37 3
|
7天前
|
消息中间件 前端开发 JavaScript
探索微前端架构:构建现代Web应用的新策略
本文探讨了微前端架构的概念、优势及实施策略,旨在解决传统单体应用难以快速迭代和团队协作的问题。微前端允许不同团队独立开发、部署应用的各部分,提升灵活性与可维护性。文中还讨论了技术栈灵活性、独立部署、团队自治等优势,并提出了定义清晰接口、使用Web组件、状态管理和样式隔离等实施策略。
|
10天前
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
|
18天前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
19天前
|
设计模式 前端开发 JavaScript
揭秘!前端大牛们如何巧妙利用JavaScript,打造智能交互体验!
【10月更文挑战第30天】前端开发领域充满了无限可能与创意,JavaScript作为核心语言,凭借强大的功能和灵活性,成为打造智能交互体验的重要工具。本文介绍前端大牛如何利用JavaScript实现平滑滚动、复杂动画、实时数据更新和智能表单验证等效果,展示了JavaScript的多样性和强大能力。
33 4
|
22天前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
24 3
|
22天前
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
36 2
|
13天前
|
前端开发 JavaScript 安全
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第7天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤。包括项目准备、安装 `javascript-obfuscator`、配置 Vite 构建以应用混淆,以及最终构建项目进行混淆。通过这些步骤,可以有效提升前端代码的安全性,防止被他人轻易分析和盗用。
|
23天前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
38 0
|
1月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
135 2
下一篇
无影云桌面