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. redis(4)String字符串

    前言 Redis中有5大数据类型,分别是字符串String.列表List.集合Set.哈希Hash.有序集合Zset,本篇介绍Redis的字符串String Redis字符串 String是Redis ...

  2. Bypass disable_functions 食用方法

    Bypass disable_functions 食用方法 目录 Bypass disable_functions 食用方法 1 上传Payload 2 直接使用sh反弹shell 3 上传 Payl ...

  3. C#泛型接口请求封装类

    using HttpUtil; using Newtonsoft.Json; using System; using System.Collections.Generic; using System. ...

  4. Linux:find 指令的选项 +n、-n、n

    描述 find 指令查找文件时可以通过时间来锁定或缩小搜查范围.其中需要利用到文件的三个时间?:Access Time(atime).Modify Time(mtime) 和 Change Time( ...

  5. 基于C++的OpenGL 14 之模型加载

    1. 引言 本文基于C++语言,描述OpenGL的模型加载 前置知识可参考: 基于C++的OpenGL 13 之Mesh - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里不过 ...

  6. 结合ChatGPT体验新必应new bing 的惊喜:这是我第一次使用的感受

    前言 最近相信大家都被 ChatGPT 刷屏了,它的爆火大家是有目共睹的,微软的新必应(New Bing) 是结合了比 ChatGPT 更强大的新一代 OpenAI 语言模式,接下来我们一起来&quo ...

  7. EF Core自动将实体映射到数据库

    protected override void OnModelCreating(ModelBuilder modelBuilder) { try { var compilationLibrary = ...

  8. autodesk2023全家桶 Autodesk 2023 所有产品下载地址

    autodesk2023全家桶 Autodesk 2023 所有产品下载地址 作者: 佚名 2022/4/10 11:51:24 Autodesk系列软件每年都会提前发布,目前autodesk2023 ...

  9. CLIP改进工作串讲(上)学习笔记

    看了跟李沐学AI系列朱毅老师讲的CLIP改进工作串讲,这里记录一下. 1.分割 分割的任务其实跟分类很像,其实就是把图片上的分类变成像素级别上的分类,但是往往图片上能用的技术都能用到像素级别上来.所以 ...

  10. 浏览器控件webBrowser

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...