js修改函数内部的this指向


在调用函数的时候偶尔在函数内部会使用到this,在使用this的时候发现并不是我们想要指向的对象.可以通过bind,call,apply来修改函数内部的this指向.

默认在浏览器下script标签内定义的函数,调用的时候函数内部的this指向window(浏览器窗口对象)

<script>
var a=2
function hello(){
console.log(this)
console.log(this.a)
}
hello()
//输出: window => object
//输出: 2
</script>

  

使用bind来修改内部的this指向 bind(option) 函数内部的this指向option这个对象

<script>
var a=2
var obj={
a:"a"
}
function hello(){
console.log(this)
console.log(this.a)
}
hello=hello.bind(obj)
hello()
//输出: obj => { a:'a' }
//输出: 'a'
</script>

  

使用call来修改内部的this指向 call(option) 函数内部的this指向option这个对象

var a=2
var obj={
a:"a"
}
function hello(){
console.log(this)
console.log(this.a)
}
hello.call(obj)
//输出: obj => { a:'a' }
//输出: 'a'

  

使用apply来修改内部的this指向 apply(option) 函数内部的this指向option这个对象

var a=2
var obj={
a:"a"
}
function hello(){
console.log(this)
console.log(this.a)
}
hello.apply(obj)
//输出: obj => { a:'a' }
//输出: 'a'

  

bind ,call ,apply 的区别

  • bind是只改变函数内部this指向,但不自调用
  • call,apply 改变函数内部指向并且自调用
  • call第一个参数是需要指向的对象,之后的参数是函数内部的形参可以访问
  • apply第一个参数是需要指向的对象,第二个参数是数组格式,函数内部的形参可以访问
//call
var a = 2
var obj={
a:'a'
}
function hello(a, b, c) {
console.log(this)
console.log(a, b, c)
}
hello.call(obj,1,2,3) // { a:'a' } 1,2,3 //apply
var a = 2
var obj={
a:'a'
}
function hello(a, b, c) {
console.log(this)
console.log(a, b, c)
}
hello.apply(obj,[1,2],3,4) // { a:'a' } 1,2,undefind,undefind

  

js修改函数内部的this指向(bind,call,apply)的更多相关文章

  1. js函数( 普通函数、箭头函数 ) 内部this的指向

    - 普通函数   | 具名普通函数.匿名普通函数,在不作为对象的属性值的情况下,其内部的 this 总是指向代码运行环境下的全局对象 ( 例如,浏览器中的 window ). 示例: (functio ...

  2. JS回调函数中的this指向(详细)

    首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun()     fun中的this->obj,自动指向.前的对 ...

  3. 如何改变函数内部 this 的指向

    一.函数内 this 的指向 1. this 的指向是当调用函数时确定的,调用的方式不同,this 的指向也就不同. 1.1 this 一般是指向调用者. 函数类型 this 的指向 普通函数 Win ...

  4. JS中函数的 this 各种指向

    this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 情形1:如果一个函数中有this,但是它没有被上一级的对象所调用, ...

  5. python中修改函数内部的变量会发生什么

    最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su( ...

  6. 改变javascript函数内部this指针指向的三种方法

    在查了大量的资料后,我总结了下面的三条规则,这三条规则,已经可以解决目前我所遇到的所有问题.规则0:函数本身是一个特殊类型,大多数时候,可以认为是一个变量. function a() { alert( ...

  7. JS高级 — 函数中的this指向问题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  8. 作用域链和函数内部this指向问题以及bind、call、apply方法

    作用域链和函数内部this指向问题以及bind.call.apply方法 作用域链 作用域是相对于变量而言的, 其意义就在与查找变量(确定变量的来处, 变量是否可以访问到, 确定变量在当前位置是否可以 ...

  9. this的指向问题 call apply bind 中的this

    在函数中this指向谁:     函数中的this指向谁,是由函数被调用的那一刻就确定下来的 平时确定一个函数中的this是谁,我们需要通过调用模式来确定 1. 函数调用模式 this ---> ...

随机推荐

  1. Java实现 LeetCode 35 搜索插入位置

    35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1, ...

  2. Java实现 LeetCode 21 合并两个有序链表

    21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...

  3. 第七届蓝桥杯JavaB组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第 ...

  4. Java实现 泊松分酒

    泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他提出过一个有趣的问题,后称为:"泊松分酒& ...

  5. 数据结构&算法

    20个最常用.最基础数据结构与算法: 10个数据结构:数组.链表.栈.队列.散列表.二叉树.堆.跳表.图.Trie 树. 10个 算法      :递归.排序.二分查找.搜索.哈希.贪心.分治.回溯. ...

  6. 天哪!手动编写mybatis雏形竟然这么简单

    前言 mybaits 在ORM 框架中,可算是半壁江山了,由于它是轻量级,半自动加载,灵活性和易拓展性.深受广大公司的喜爱,所以我们程序开发也离不开mybatis .但是我们有对mabtis 源码进行 ...

  7. Codeblocks 解决界面模糊的方法

    之前用16.01不愿意升17.12的原因就是升级后界面变得非常模糊感觉很难看,找了个方法把这个问题解决了,这个方法能解决绝大多数软件打开后界面模糊的问题 (DEV模糊也能解决). 1.安装软件后桌面会 ...

  8. .Net 对于PDF生成以及各种转换的操作

    前段时间公司的产品,要做一个新功能,签章(就是把需要的数据整理成PDF很标准的文件,然后在盖上我们在服务器上面的章) 然后我就在百度上找了找,发现搞PDF的类库很少,要么就要钱,要么就有水印,破解版的 ...

  9. 在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!

    如果我们手头上有1台群晖NAS时,有没有考虑过把群晖NAS当成服务器来使用,这样会不会很有意思呢? 现在,我们终于可以尝试一番了,把群晖NAS变成一台实实在在的服务器,在上面跑各种运行环境!其实很简单 ...

  10. opencv C++图像读取

    int main(){ cv::Mat img=cv::imread("/home/nan/图片/highdeepth/starry.jpg",cv::IMREAD_REDUCED ...