Q&A:为什么prototype中的方法不能赋值给变量,再调用?

做题时遇到了一道排序题,我的解法是:

 1 function largestOfFour(arr) {
 2     var larger = Array.prototype.sort();
 9     for (var i = 0; i < arr.length; i++) {
10         arr[i].larger();
11     }
12     for (var i = 0; i < arr.length; i++) {
13         arr[i] = arr[i][0];
14     }
15     return arr;
16 }

运行后,控制台报错:

我其实是脑子抽了 把sort方法赋给一个变量再来调用,多此一举。

正常人的写法应该是:

1  function largestOfFour(arr) {
2      for (var i = 0; i < arr.length; i++) {
3          arr[i].sort();
4     }
5     for (var i = 0; i < arr.length; i++) {
6         arr[i] = arr[i][0];
7     }
8     return arr;
9 }

但我不能理解为什么开始将Array.prototype.sort方法赋给变量调用会报错。

事实上,typeof (larger)  === "function"

经过查找资料,发现这确实是错误的写法,不过报错没报到点子上。

真实报错的地方是在尝试把 this 当做函数执行的那个地方,而这里this是 undefined,这是js V8 引擎的问题。

原文地址:https://www.cnblogs.com/abcdecsf/p/12587808.html

时间: 2024-11-29 01:37:01

Q&A:为什么prototype中的方法不能赋值给变量,再调用?的相关文章

JS-Array.prototype 中的方法的坑

fill() 今天刷 HackerRank 的题遇到需要创建链表数组(一维数组的每一项是个链表)的题. 众所周知 JS 中的数组可以当链表用,我就用如下代码进行创建 let seqs = (new Array(5)).fill([]) 运行时结果很是诡异,经调试发现这数组这五项指向的是同一个数组,看来 fill 方法并不是每次都创建新的数组. 然后我又尝试使用let seqs = (new Array(5)).map(() => [])得到的结果和new Array(5)一样是一个长度为 5 的

CImage::Loda 方法加载图片失败,因为vs2013中该方法不支持中文变量

最近用MFC做实验,写个图片处理的程序.基本框架是别人用vs2010写好的,我只是添加一些图片处理的函数方法就行了,但是奇怪的是我一直都不能在上面打开图片. 此bug困扰了我好几天,代码是没有问题的,因为别人电脑上就可以打开图片,为什么我的就不行...而且在CImage中的Load方法调用后,我用isNull方法检查都显示为空,即没有成功加载图片. 然后无意间发现我打开的图片路径名都含有中文,于是我改为纯英文后,果然就没有这个问题了.其实是vs2010上CImage类的Load方法接受中文变量,

C#通过反射获取类中的方法和参数个数,反射调用方法带参数

using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(string[] args) { //反射获取 命名空间+类名 string className = "ConsoleApp2.ClassSample"; string methodName = "test1"; //传递参数 Object[] paras = new Obje

Effective JavaScript Item 47 绝不要向Object.prototype中添加可列举的(Enumerable)属性

本系列作为Effective JavaScript的读书笔记. 如果你的代码中依赖于for..in循环来遍历Object类型中的属性的话,不要向Object.prototype中添加任何可列举的属性. 但是在对JavaScript执行环境进行增强的时候,往往都需要向Object.prototype对象添加新的属性或者方法.比如可以添加一个方法用于得到某个对象中的所有的属性名: Object.prototype.allKeys = function() { var result = []; for

idea中查看方法的调用链

Eclipse的"Call Hierarchy"可以查看一个Java方法或类成员变量的调用树(caller和callee两个方向),非常方便. 在IDEA中类似功能被划分到了三个命令. IntelliJ IDEA中可以在主菜单中选择Navigate | Call Hierarchy命令查看一个Java方法调用树(caller和callee两个方向),但是不像Eclipse那样可以查看类成员变量的调用树. 如下图,左上角的两个按钮是调用和被调用关系的显示. IntelliJ IDEA中可

在Spring Bean的生命周期中各方法的执行顺序

Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下十种: 通过实现 InitializingBean 接口来定制初始化之后的操作方法: 通过实现DisposableBean 接口来定制销毁之前的操作方法: 通过元素的 init-method属性指定初始化之后调用的操作方法: 通过元素的 destroy-method属性指定销毁之前调用的操作方法: 在指定方法上加上 @PostConstruct

JavaScript中的Array.prototype.slice.call()方法学习

JavaScript中的Array.prototype.slice.call(arguments)能将有length属性的对象转换为数组(特别注意: 这个对象一定要有length属性). 但有一个例外,IE下的节点集合它不能转换(因为IE下的dom对象是以com对象的形式实现,js对象和com对象不能进行转换) 首先,我们来看看JavaScript中的slice用法, 在JavaScript中Array是一个类,slice是此类中的一个方法,slice的中文意思是 '截取' 一个是String.

JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈

toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种类型转化为字符串类型的呢? 通过下面几个例子,我们便能获得答案: 1.将boolean类型的值转化为string类型: console.log(true.toString());//"true" console.log(false.toString());//"false&quo

Collections中sort()方法源代码的简单分析

Collections的sort方法代码: public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.