js面试题:fn.call.call.call.call(fn2) 解析

news/2024/11/24 11:30:55/

有这样一道 JS面试题,问 fn.call.call.call.call(fn2) 的结果是什么?

先说下 call 函数的内部原理:

  1. 可以改变函数的this;
  2. 执行函数

下面模拟下 原生的call函数:

Function.prototype.call = function(context, ...args){context = context? Object(context) : window;// 改变 this context.fn = this;// 执行函数return  context.fn(...args);
}

如下:

function fn(){console.log(11)
}function fn2(){console.log(22)
}
问:
fn.call.call.call.call(fn2) 的结果是什么?

解析:

  1. 前面的一串 fn.call.call.call.call 并没有调用,只是获取对象的call属性,所以,这一串的结果是 Function.call 属性。
  2. 所以那一串 就是 Function.call.call(fn2);还可以解理为 fn3.call(fn2)。
  3. 根据call的原理(可参考上面的call模拟),在 fn3执行call,其实际是这样执行的 fn2.fn3()
  4. 由于 fn3实际上就是 call 函数,所以, fn2.fn3() 等价于 fn2.call()
  5. 所以,上面那一串代码的最终结果,就是调用 fn2,所以结果输出 22.

http://www.ppmy.cn/news/542793.html

相关文章

定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2()

定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2(),在主函数中声明一个DerivedClass的对象,分别用DerivedClass的对象以及BaseClass和DerivedCla…

定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2()。

在主函数中声明一个DerivedClass的对象&#xff0c;分别用DerivedClass的对象以及BaseClass和DerivedClass的指针来调用fn1()&#xff0c;fn2()&#xff0c;观察运行结果。 #include<iostream>using namespace std;class BaseClass { public:void fn1() const { cout<…

1.定义一个基类 Base,有两个公有成员函数fn1( ),fn2 ( )。 私有派生出Derived类,如何通过Derived 类的对象调用基类的函数fnl() ?

老师布置的题目 1.定义一个基类 Base&#xff0c;有两个公有成员函数fn1( )&#xff0c;fn2 ( )。 私有派生出Derived类&#xff0c;如何通过Derived 类的对象调用基类的函数fnl() ? #include<iostream> using namespace std; class Base{ public:// Base(…

定义一个基类BAse,有两个公有成员函数fn1,fn2;私有派生出derived类,如何通过derived类的对象调用基类的函数fn1;

具体代码如下&#xff1a; #include <iostream> using namespace std; class Base{ //基类Base public:int fn1(){return 0;};int fn2(){return 0;}; }; class Derived:private Base{ //派生类Derived&#xff1b; public:int fn1(){return Base::fn1();}//返回Base类…

多态性练习:定义一个基类BaseClass,从他派生出类DerivedClass。BaseClass有成员函数 fn1(),fn2()

fn1&#xff08;&#xff09;是虚函数&#xff1b;DerivedClass也有成员函数 fn1()&#xff0c;fn2()。在主函数中声明一个DerivedClass的对象&#xff0c;分别用BaseClass和DerivedClass的指针指向DerivedClass的对象&#xff0c;并通过指针调用fn1()&#xff0c;fn2()&#x…

08 Python-函数(一)(二)

文章目录 1. 可变对象2.函数简介3. 函数的参数3.1 形参和实参3.2 函数的传递方式3.3 实参的类型3.4 不定长参数3.5 参数的解包 4.函数的返回值5.档字符串6.函数的作用域6.1. 作用域(scope)6.1.1 全局作用域6.1.2 函数作用域 7.递归函数7.1.递归式函数有2个条件7.2.递归经典练习…

处理 JavaScript 异步操作的几种方法总结

引言 js的异步操作&#xff0c;已经是一个老生常谈的话题&#xff0c;关于这个话题的文章随便google一下都可以看到一大堆。处理js的异步操作&#xff0c;都有一些什么方法呢&#xff1f;仁者见仁智者见智 一、回调函数 传说中的“callback hell”就是来自回调函数。而回调函…

leetcode1.两数之和

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【LeetCode】 &#x1f353;希望我们一起努力、成长&#xff0c;共同进步。 题目链接 给定一个整数数组 nums 和一个整数目标值 target&am…