eval对函数this指向的影响
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指向的影响的更多相关文章
- 【C语言】14-返回指针的函数与指向函数的指针
前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...
- 5. 箭头函数_this 指向_es6 常用语法
1. 箭头函数 函数的简写方式 () => {} 只有一个参数时,可以省略() ---- x => {} 只有一条语句时,可以省略{},此时这点语句的结果会作为函数的返回值返回 () = ...
- 在函数内部定义的函数 this 指向 undefined
在函数内部定义的函数 this 指向 undefined 以下这个 this 就是指向 undefined. 但在非 strict 模式下是指向 window <script> 'use ...
- ES6 箭头函数 this 指向
ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...
- 【C语言】-返回指针的函数与指向函数的指针
本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.i ...
- call和apply第一个参数为null/undefined,函数this指向全局对象
call和apply第一个参数为null/undefined,函数this指向全局对象,在浏览器中是window,在node中是global 在严格模式中(ie 6/7/8/9 除外),传入null/ ...
- ES6 箭头函数this指向问题
var name = "window"; var person1 = { name: "person1", show1: function() { consol ...
- 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)
一.函数的定义方式 1.函数声明方式 function 关键字(命名函数) 2.函数表达式(匿名函数) 3.new Function( ) var fn = new Function(‘参数1 ...
- eval(str)函数
转载:地址于http://blog.csdn.net/SeeTheWorld518/article/details/47983511 eval(str)函数很强大,官方解释为:将字符串str当成有效的 ...
- C语言:判断字符串是否为回文,-函数fun将单向链表结点数据域为偶数的值累加起来。-用函数指针指向要调用的函数,并进行调用。
//函数fun功能:用函数指针指向要调用的函数,并进行调用. #include <stdio.h> double f1(double x) { return x*x; } double f ...
随机推荐
- redis(4)String字符串
前言 Redis中有5大数据类型,分别是字符串String.列表List.集合Set.哈希Hash.有序集合Zset,本篇介绍Redis的字符串String Redis字符串 String是Redis ...
- Bypass disable_functions 食用方法
Bypass disable_functions 食用方法 目录 Bypass disable_functions 食用方法 1 上传Payload 2 直接使用sh反弹shell 3 上传 Payl ...
- C#泛型接口请求封装类
using HttpUtil; using Newtonsoft.Json; using System; using System.Collections.Generic; using System. ...
- Linux:find 指令的选项 +n、-n、n
描述 find 指令查找文件时可以通过时间来锁定或缩小搜查范围.其中需要利用到文件的三个时间?:Access Time(atime).Modify Time(mtime) 和 Change Time( ...
- 基于C++的OpenGL 14 之模型加载
1. 引言 本文基于C++语言,描述OpenGL的模型加载 前置知识可参考: 基于C++的OpenGL 13 之Mesh - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里不过 ...
- 结合ChatGPT体验新必应new bing 的惊喜:这是我第一次使用的感受
前言 最近相信大家都被 ChatGPT 刷屏了,它的爆火大家是有目共睹的,微软的新必应(New Bing) 是结合了比 ChatGPT 更强大的新一代 OpenAI 语言模式,接下来我们一起来&quo ...
- EF Core自动将实体映射到数据库
protected override void OnModelCreating(ModelBuilder modelBuilder) { try { var compilationLibrary = ...
- autodesk2023全家桶 Autodesk 2023 所有产品下载地址
autodesk2023全家桶 Autodesk 2023 所有产品下载地址 作者: 佚名 2022/4/10 11:51:24 Autodesk系列软件每年都会提前发布,目前autodesk2023 ...
- CLIP改进工作串讲(上)学习笔记
看了跟李沐学AI系列朱毅老师讲的CLIP改进工作串讲,这里记录一下. 1.分割 分割的任务其实跟分类很像,其实就是把图片上的分类变成像素级别上的分类,但是往往图片上能用的技术都能用到像素级别上来.所以 ...
- 浏览器控件webBrowser
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...