在一些jQuery插件中经常看到类似 callback.call(xxx,xxx) 虽然看到书上有介绍 说call和apply函数可以改变作用域,但还是无法非常透彻的理解改变作用域主要是为了解决什么问题,有没有替代方案,或者 这2个函数主要为了解决什么问题,应用场景,何时使用最合适,每次读到这样的代码就晕了,一下子从线性阅读中跳出去了,感觉有点绕 call和apply的作用很简单,就是改变上下文,适用场景太多了,虽然有时候只是为了“美观”,下面几个...
今天看代码,遇到一个eval函数的问题,到现在翻了很多博文,还是不是很懂eval函数,有个一直没法理解的代码如下:/* var start = [], end = [], timings = []; */ function f(){//模拟程序执行时间var sum = 0;for(var i =0 ;i < 100000; i++){sum = sum/(i+1);} } function repeat(n, action){for(var i=0; i<n ;i++){eval(action); // eval函数} } function benchmark(){var start = [], end = [], timings = [];repeat(100, "sta...
如果初次打交道,很多人会觉得js很简单。确实,对于很多有经验的工程师,或者甚至是初学者而言,实现基本的js功能几乎毫无障碍。但是JS的真实功能却比很多人想象的要更加多样、复杂。JavaScript的许多细节规定会让你的网页出现很多意想不到的bug,搞懂这些bug,对于成为一位有经验的JS开发者很重要。常见错误一:对于this关键词的不正确引用我曾经听一位喜剧演员说过:“我从未在这里,因为我不清楚这里是哪里,是除了那里之外的地...
我们先来看一个例子function foo() {console.log( this.a ); } var obj = {a: 2,foo: foo }; obj.foo(); // 2this指向了obj,因为foo执行时的call-site(可以理解为调用时所在作用域)在obj上面。注意是运行的时候,和在哪里声明的没有关系。 call-site and call-stackcall-site姑且理解为调用域,call-stack为调用栈。如下代码可以辅助我们理解function baz() {// call-stack is: `baz`// so, our call-site is in the global scop...
在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法.var arr = []; console.log(Object.prototype.toString.call(arr)) //"[object Array]"本文要讲的就是,toString方法是如何做到这一点的,原理是什么. ECMAScript 3 在ES3中,Object.prototype.toString方法的规范如下:15.2.4.2 Object.prototype.toString()在toString方法被调用时,会执行下面的操作步骤: 1. 获取this对象的[[...
本文介绍了map给我们的js编程带来的好处及便利: 1.Map能干什么 map可以实现for循环的功能:var arr = ['val1', 'val2', 'val3']; for(var i = 0; i 这里的好处是,我们可以随意在map里面写函数,这样的话代码可读性会大大提高,如下:function output(val, index, array) { console.log(val); console.log(index); console.log(array); } arr.map(output); 2.Map的兼容性 ECMAScript 5 标准定义了原生的 map() 方法,所以浏览器...
我们都知道,高级浏览器可以用 JSON.parse() API 将一个 JSON 字符串解析成 JSON 数据,稍微欠妥点的做法,我们可以用 eval() 函数。var str = '{"name": "hanzichi", "age": 10}'; var obj = eval('(' + str + ')'); console.log(obj); // Object {name: "hanzichi", age: 10}是否注意到,向 eval() 传参时,str 变量外裹了一层小括号?为什么要这样做? 我们先来看看 eval 函数的定义以及使用。 eval() 的参数是一个字符串。如果...
Date类型ECMASCript中的Date类型是在早期中Java中的java.util.Date类基础上构建的。为此Date类型使用自UTC(国际协调时间)1970年1月1日午夜(0时)开始经过的毫秒数来保存日期。创建日期对象1.创建当前日期。不需要传入参数 2.创建指定日期。需要传入参数,必须传入表示该日期的毫秒数(即从1970年1月1日午夜起至该日期止经过的毫秒数)。为了简化这一计算过程,ECMAScript提供了两个方法:Date.parse()和Date.UTC()。var now = new Date(...
Array.prototype.forEach()方法让数组的每一项都执行一次给定的函数。 — MDN 假设有这么一个场景,你拿到了这么一个数组 [{ symbol: "XFX", price: 240.22, volume: 23432 },{ symbol: "TNZ", price: 332.19, volume: 234 },{ symbol: "JXJ", price: 120.22, volume: 5323 }, ] 你需要为其中的symbol创建一个新数组, 也就是 [ "XFX", "TNZ", "JXJ"] 一般可以用for循环实现:function getStockSymbols(stocks) {var symbols = [],s...
1、为什么要获取undefined? 因为undefined在javascript中不是保留字,可以被用户当做变量来赋值,这样如果我们后期需要用到undefined来检测一个变量的话,那么检测的值就不准确了; 举个栗子:var undefined=10; function sum(a,b){if(a===undefined||b===undefined){console.log("参数不正确");}18101130357return a+b; }sum(10,10)->本来正确的参数,控制台输出的确实"参数错误"; 这时候,为了兼容所有的浏览器,我们就需要获取...
在JavaScript中,call、apply和bind是Function对象自带的三个方法,本文将通过几个场景的应用,来详细理解三个方法。 call()call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法。 当调用一个函数时,可以赋值一个不同的 this 对象。this 引用当前对象,即 call 方法的第一个参数。 通过 call 方法,你可以在一个对象上借用另一个对象上的方法,比如Object.prototype.toString.call([]),就是一个Ar...
如何向 setTimeout 、 setInterval 传递参数 看如下代码:var str = 'aaa'; var num = 2; function auto(num){ alert(num); } setTimeout('auto(num)',4000); 这样写是可以正常工作的,但是如其说这是参数传递,还不如说是直接使用的全局变量。所以,这种写法是没有必要的,一般情况下更多的是用到传递局部变量作为参数。 把代码修改一下://var str = 'aaa'; var num = 2; function test(){ var str = 'bbb'; setTimeout('a...
js循环数组各种方法 eg1:for (var i = 0; i eg2:Array.prototype.foo = "foo!"; var array = ['a', 'b', 'c']; for (var i in array) { alert(array[i]); } for(var i in this.$GLOBAL_DETAIL.album_photo_ids){if(this.$GLOBAL_DETAIL.album_photo_ids[i] == "3487675024077108") alert(this.$GLOBAL_DETAIL.album_photo_ids[i]);} eg3:[1,2,3,4].map( function(item) { alert(item); }) eg4:var x = [1,2,3,4].map( funct...
Underscore.js库 你一天(一周)内写了多少个循环了?var i; for(i = 0; i 这当然无害,但这种写法非常丑而且奇怪,这也不是真正需要抱怨的。但这种写法太平庸了。var i,j; for(i = 0; i 你在扩展糟糕的代码,在你抛出一大堆if前,你已经精神错乱了。 我在两年里没有写一个循环(loop)。 “你在说什么?” 这是真的,一个冷笑话。其实不是一个都没有(好吧,我确实写了几个),因为我不写循环(loops),我的代码更容易理解。 怎么做的...
arguments是什么? arguments是函数调用时,创建的一个类似的数组但又不是数组的对象,并且它存储的是实际传递给函数的参数,并不局限于函数声明的参数列表哦。 尼玛,什么意思? 写个demo看看,代码见下argumentsfunction obj(){//利用instanceof判断argumentsconsole.log( 'arguments instanceof Array ' + (arguments instanceof Array) );console.log( 'arguments instanceof Object ' + (arguments instanceof Object) );cons...