JavaScript-改变this指向
一、this指向的详解
概括:this的指向到底是指向哪里?通常来说,只有当函数执行的时候才可以确定this指向的到底是谁,简单的也可以这么说:this最终指向的是那个调用它的对象。
常见的一般有以下几种情况:
第一种:在一个函数中有this,但是函数没有被上一级对象所调用,所以此时的this指向的是window(注意在严格模式下则不是),如以下代码:
function blue() {
var blue = "蓝源";
console.log(this.blue);//undefind
console.log(this);//window
}
blue();//this指向调用它的那个对象,在这里相当于window
第二种:在函数中有一个this,而且该函数被上一级对象所调用,所以此时的this指向的是调用该函数的上一级对象,如以下代码:
var o = {
name: "blue",
fn: function(){
console.log(this.name);//blue
console.log(this);//指向o对象
}
}
o.fn();//此时this指向的是调用函数的对象o。
第三种:有一个函数中有this,函数中有多个对象,尽管这个函数是被最外层的对象调用,但是其中的this指向的只是它的上一级对象,如以下代码:
var o = {
name: "blue",
a: {
fn: function(){
console.log(this.name);//undefind,这里有两个对象o和a,调用的时候都指向上一层对象a,这里找不到声明的name
}
},
fn1: function(){
console.log(this.name);//blue
}
}
o.fn1();
o.a.fn();
第四种(特殊情况):如果函数中有return,而且return返回的是一个对象,那么调用时候的this指向不再是指向调用这个函数的实例了,而是指向这个函数返回的对象,如以下代码:
function fn()
{
this.name = 'blue';
return {};
}
var a = new fn;
console.log(a.name); //undefined,这里指向的是return返回的对象,是一个空对象
二、改变this指向的方法
第一种:使用call()
var a = {
user:"blue",
fn:function(){
console.log(this.user); //blue
}
}
var b = a.fn;
b.call(a); //若不用call,则b()执行后this指的是Window对象
call方法除了第一个参数以外还可以添加多个参数,如下:
var a = {
user:"blue",
fn:function(c,d){
console.log(this.user); //blue
console.log(e+ee); //3
}
}
var b = a.fn;
b.call(a,1,2);
第二种:使用apply()
var a = {
user:"blue",
fn:function(){
console.log(this.user); //blue
}
}
var b = a.fn;
b.apply(a);
apply方法和call方法很类似,也可以接收多个参数,但是第二个参数必须是数组,如下:
var a = {
user:"blue",
fn:function(e,ee){
console.log(this.user); //blue
console.log(c+d); //11
}
}
var b = a.fn;
b.apply(a,[10,1]);
第三种:使用bind()
bind和call,apply的使用方法有些不同,如果我们还是按照上面的方法写代码,会发现一些问题,如下:
var a = {
user:"blue",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
b.bind(a); //代码没有被打印
为什么代码没有被打印呢?这就是不同的地方所在,实际上执行bind之后返回的是一个函数,想下面这样写才是正确的:
var a = {
user:"blue",
fn:function(){
console.log(this.user); //blue
}
}
var b = a.fn;
var c = b.bind(a);
c();
bind()方法也可以接收多个参数,并且参数可以执行的时候再次添加,但是要注意的是,参数是按照形参的顺序进行的,如下:
var a = {
user:"blue",
fn:function(e,d,f){
console.log(this.user); //blue
console.log(e,d,f); //10 1 2
}
}
var b = a.fn;
var c = b.bind(a,10);
c(1,2);
总结:
call(),apply()以及bind()方法都可以改变this指向,只是所使用的场景有点不一样,bind()改变后的函数想什么时候调用就什么时候调用,call和apply都是改变指向后立即调用此方法。
JavaScript-改变this指向的更多相关文章
- js中改变this指向的call、apply、bind 方法使用
前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...
- $.on()方法和addEventListener改变this指向
jQuery $.on()方法和addEventListener改变this指向 标签(空格分隔): jQuery JavaScript jQuery $.on() jq的绑定事件使用$([selec ...
- setTimeout改变this指向(****************************************)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 前端js中this指向及改变this指向的方法
js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...
- this(this的4种指向和改变this指向的方式)
this是Javascript语言的一个关键字. 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 1.this指向的形式4种 a.如果是 ...
- javascript中this指向的问题
javascript中this只有函数执行时候才能确定到底指向谁,实际this最终指向是那个调用它的对象. 1,匿名函数中的this——window function foo(){ var lastN ...
- JS中this指向问题和改变this指向
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- Javasript中this指向问题和改变this指向的方法
在学习javascript中我们往往会被this的指向问题弄的头昏转向,今天我们就来学习一下this的指向问题,和改变this指向的方法. 一.this的指向问题 在学习this的指向问题之前我们需要 ...
- 可以改变this指向的方法
this一般指向的是当前被调用者,但也可以通过其它方式来改变它的指向,下面将介绍三种方式: 1.call用作继承时: function Parent(age){ this.name=['mike',' ...
- 图解javascript中this指向
JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...
随机推荐
- 个人网站(sysoft.net.cn)被k,公司名都搜索不出来了,怎么办?
今年上班后,好2019年3月初,上班后(年前大病一场 ,两个月没维护网站),发现公司网站所有收录都掉了,搜索公司名都不不到了,宝宝真是惊呆了. 有些人说是百度出了故障,有人说是百度算法. 说句 ...
- DBCP
DBCP(DataBase Connection Pool)数据库连接池,由Apache公司开发.连接池的运用避免了反复建立连接造成的资源浪费,预先建立一些连接放在数据库连接池中,需要时取出,不需要时 ...
- 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(中)
引言 相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 因此数据湖相关服务 ...
- uboot学习之uboot-spl的程序流程分析
uboot-spl的程序流程主要包含下面的几个函数: _start->reset->save_boot_params->cpu_init_crit->lowlevel_init ...
- 将maven项目到入到idea中
一,前言 在文章将maven项目导入到eclipse中中我将新建的项目到入到了eclipse中了,因为最近也在尝试idea,那么就顺便也到入idea中. maven项目的话,我就使用在文章使用命令行创 ...
- OpenGL在ubuntu下的成功配置
sudo apt-get update sudo apt-get install build-essential sudo apt-get install libgl1-mesa-dev sudo a ...
- DeleteFolder
import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; /*** * @author ...
- ps查看图层大小快捷键
1.图层大小尺寸的: ctrl+alt+c 2.图片大小尺寸.像素大小: ctrl+alt+i
- Spring Boot 监听 Activemq 中的特定 topic ,并将数据通过 RabbitMq 发布出去
1.Spring Boot 和 ActiveMQ .RabbitMQ 简介 最近因为公司的项目需要用到 Spring Boot , 所以自学了一下, 发现它与 Spring 相比,最大的优点就是减少了 ...
- Redis-->windows上的安装教程
Windows下安装Redis服务 说明:本文拷贝自http://www.cnblogs.com/jaign/articles/7920588.html Redis是有名的NoSql数据库,一般Lin ...