js eval() 对 this 指向的影响

const fn = () => {
console.log('fn this is:', this)
} function evalWrapper(str) {
console.log('eval wrapper this is: ', this)
return eval(str)
} const fn2 = evalWrapper(fn.toString()) // Window
const fn3 = evalWrapper.bind({ a: 1 })(fn.toString()) // Object { a: 1 }
fn() // Window
fn2() // Window
fn3() // Object { a: 1 }

eval返回的函数, 即使是箭头函数, this指向也不随着调用者变更, 这与箭头函数this指向随着调用者而改变不符, 原因不详

以下是更详细的验证过程:

const fn = () => {
console.log('fn this is:', this)
} function evalWrapper(str) {
console.log('eval wrapper this is: ', this)
return eval(str)
} function execute(fn) {
console.log('execute this is:', this)
fn()
} const anotherThis = { a: 1 } console.log('生成fn2, fn3')
const fn2 = evalWrapper(fn.toString())
const fn3 = evalWrapper.bind(anotherThis)(fn.toString()) console.log('直接执行fn, fn2, fn3')
fn()
fn2()
fn3() console.log('改变this指向后调用fn, fn2, fn3')
execute.bind(anotherThis)(fn)
execute.bind(anotherThis)(fn2)
execute.bind(anotherThis)(fn3)

PS: 如果可以不使用eval, 请不要使用eval

eval对函数this指向的影响的更多相关文章

  1. 【C语言】14-返回指针的函数与指向函数的指针

    前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...

  2. 5. 箭头函数_this 指向_es6 常用语法

    1. 箭头函数 函数的简写方式 () => {} 只有一个参数时,可以省略() ---- x => {} 只有一条语句时,可以省略{},此时这点语句的结果会作为函数的返回值返回  () = ...

  3. 在函数内部定义的函数 this 指向 undefined

    在函数内部定义的函数 this 指向 undefined 以下这个 this 就是指向 undefined. 但在非 strict 模式下是指向 window <script> 'use ...

  4. ES6 箭头函数 this 指向

    ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...

  5. 【C语言】-返回指针的函数与指向函数的指针

    本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...

  6. call和apply第一个参数为null/undefined,函数this指向全局对象

    call和apply第一个参数为null/undefined,函数this指向全局对象,在浏览器中是window,在node中是global 在严格模式中(ie 6/7/8/9 除外),传入null/ ...

  7. ES6 箭头函数this指向问题

    var name = "window"; var person1 = { name: "person1", show1: function() { consol ...

  8. 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)

    一.函数的定义方式 1.函数声明方式 function  关键字(命名函数) 2.函数表达式(匿名函数) 3.new  Function( ) var  fn = new  Function(‘参数1 ...

  9. eval(str)函数

    转载:地址于http://blog.csdn.net/SeeTheWorld518/article/details/47983511 eval(str)函数很强大,官方解释为:将字符串str当成有效的 ...

  10. C语言:判断字符串是否为回文,-函数fun将单向链表结点数据域为偶数的值累加起来。-用函数指针指向要调用的函数,并进行调用。

    //函数fun功能:用函数指针指向要调用的函数,并进行调用. #include <stdio.h> double f1(double x) { return x*x; } double f ...

随机推荐

  1. [SHOI2006]仙人掌

    [SHOI2006]仙人掌 简要解析 其实很简单 只要普通树形 \(dp\) 就行了 \(f_x\) 表示 \(x\) 能向下延深的最大距离,\(v\) 是 \(x\) 的儿子 当一个点不属于任何环时 ...

  2. .Net DI(Dependency Injection)依赖注入机制

    1.简介 DI:Dependency Injection,即依赖注入,他是IOC的具体实现. 在DI中,底层服务对象不再负责依赖关系的创建,而是交由顶端调用进行管理注入 好处:降低组件之间的耦合度,使 ...

  3. EMQ X 系统调优和性能压测

    前言 如果使用 EMQ 来承载百万级别的用户连接可以吗?毕竟在 MQTT 官方介绍上说 EMQ X 可以处理千万并发客户端,而 EMQ X 自己官方称 4.x 版本 MQTT 连接压力测试一台 8 核 ...

  4. angular中echart的使用

    <div class="ringlike-chart" echarts [options]="options" (chartInit)="onC ...

  5. HP DC7800 升级CPU出现:Missing or Invalid Processor Microcode Update —— 解决方案:更新主板BIOS

    1.所需文件在这个网盘里面:链接:https://pan.baidu.com/s/140DI2SyRmPf0Q-ikXcJMcQ 提取码:yjth 2.这个问题的解决参考了:https://h3043 ...

  6. ionic混合开发总结之调用手机相机

    整理一下,给接触ionic的伙伴们一些参考,少走弯路. 调用手机的前提是已经成功创建了项目. 首先,要下载两个插件,一个是 cordova-plugin-camera,是调用相机的插件,还有一个是Ng ...

  7. linux开放指定端口

      sudo ufw allow 端口号

  8. sql server某列数据值逐行累加

    sql语句示例: DECLARE @pts varchar(max)='[{"x":5.801718000000000e+002,"y":3.633722000 ...

  9. Django路由重定向

    路由重定向又称HTTP协议重定向,也可以称为网页跳转,它对应的HTTP状态码为301.302.303.307.308. 网页重定向就是在浏览器访问某个网页的时候,这个网页不提供响应内容,而是自动跳转到 ...

  10. 记录将Base64字符串转化为图片遇到的问题

    今天通过与别人写的api交互,获取到了一个原为图片的base64字符串,在网上找到了相互转换的方法,但是在转化时,报出了"输入不是有效的 Base64 字符串,因为它包含非 base 64 ...