AJax技术

浅析Ajax语法(3)

字号+ 作者:H5之家 来源:H5之家 2017-04-11 17:02 我要评论( )

上方对象方法中的this指向对象本身,所以输出”xiaoming”。 var obj = {myName: xiaoming,getName: function () {return this.myName}};var nameFn = obj.getName;console.log(nameFn()); // undefined 上方将对象

上方对象方法中的this指向对象本身,所以输出”xiaoming”。

var obj = { myName: 'xiaoming', getName: function () { return this.myName } }; var nameFn = obj.getName; console.log(nameFn()); // undefined

上方将对象中的方法赋值给了一个变量,此时方法中的this也将不再指向obj对象,从而指向window对象,所以console为”undefined”。

var obj = { myName: 'xiaoming', getName: function () { return this.myName } }; var obj2 = { myName: 'xiaohua' }; var nameFn = obj.getName; console.log(nameFn.apply(obj2)); // 'xiaohua'

上方同样将obj对象中的方法赋值给了变量nameFn,但是通过apply方法将this指向了obj2对象,所以最终console为’xiaohua’。

4.函数参数

function test6() { console.log(arguments); // [1, 2] } test6(1, 2);

上方利用函数中的arguments对象获取传入函数的参数数组,所以输出数组[1, 2]。

function test7 () { return function () { console.log(arguments); // 未执行到此,无输出 } } test7(1, 2);

上方同样利用arguments获取参数,但因test7(1, 2)未执行return中的函数,所以无输出,若执行test7(1, 2)(3, 4)则会输出[3, 4]。

var args = [1, 2]; function test9() { console.log(arguments); // [1, 2, 3, 4] } Array.prototype.push.call(args, 3, 4); test9(...args);

上方利用Array.prototype.push.call()方法向args数组中插入了3和4,并利用ES6延展操作符(…)将数组展开并传入test9,所以console为[1, 2, 3, 4]。

5.闭包问题

var elem = document.getElementsByTagName('p'); // 如果页面上有5个p for(var i = 0; i < elem.length; i++) { elem[i].onclick = function () { alert(i); // 总是5 }; }

上方是一个很常见闭包问题,点击任何p弹出的值总是5,因为当你触发点击事件的时候i的值早已是5,可以用下面方式解决:

var elem = document.getElementsByTagName('p'); // 如果页面上有5个p for(var i = 0; i < elem.length; i++) { (function (w) { elem[w].onclick = function () { alert(w); // 依次为0,1,2,3,4 }; })(i); }

在绑定点击事件外部封装一个立即执行函数,并将i传入该函数即可。

6.对象拷贝与赋值

var obj = { name: 'xiaoming', age: 23 }; var newObj = obj; newObj.name = 'xiaohua'; console.log(obj.name); // 'xiaohua' console.log(newObj.name); // 'xiaohua'

上方我们将obj对象赋值给了newObj对象,从而改变newObj的name属性,但是obj对象的name属性也被篡改,这是因为实际上newObj对象获得的只是一个内存地址,而不是真正 的拷贝,所以obj对象被篡改。

var obj2 = { name: 'xiaoming', age: 23 }; var newObj2 = Object.assign({}, obj2, {color: 'blue'}); newObj2.name = 'xiaohua'; console.log(obj2.name); // 'xiaoming' console.log(newObj2.name); // 'xiaohua' console.log(newObj2.color); // 'blue'

上方利用Object.assign()方法进行对象的深拷贝可以避免源对象被篡改的可能。因为Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。

var obj3 = { name: 'xiaoming', age: 23 }; var newObj3 = Object.create(obj3); newObj3.name = 'xiaohua'; console.log(obj3.name); // 'xiaoming' console.log(newObj3.name); // 'xiaohua'

我们也可以使用Object.create()方法进行对象的拷贝,Object.create()方法可以创建一个具有指定原型对象和属性的新对象。

结语

学习JavaScript是一个漫长的过程,不能一蹴而就。希望本文介绍的几点内容能够帮助学习JavaScript的同学更加深入的了解和掌握JavaScript的语法,少走弯路。

以上就是一些容易犯错的JavaScript知识点整理的详细内容,更多请关注php中文网其它相关文章!

在IT界,需要大量的javascript开发者。如果这个角色能够最佳地展现你的能力,那么你有许多机会换家公司,以及提高薪水。但是在你被公司录取之前,你需要展现你的技术,以便通过面试环节。在这篇文章中,我会展示你五个典型的问题。

问题1: 范围(Scope)

思考以下代码:

(function() { var a = b = 5; })(); console.log(b);

控制台(console)会打印出什么?

答案

上述代码会打印出 5 。

这个问题的陷阱就是,在立即执行函数表达式(IIFE)中,有两个命名,但是其中变量是通过关键词 var 来声明的。这就意味着 a 是这个函数的本地变量。与此相反, b 是属于这个函数的全局变量的。

这个问题另一个陷阱就是,在函数中他没有使用 "严格模式" ( 'use strict'; )。如果 严格模式 开启,那么代码就会报出未捕获引用错误(Uncaught ReferenceError):b没有定义。记住严格模式要求,如果这个是预期的行为,你需要明确地引用全局变量,。因此,你需要像下面这么写:

(function() { 'use strict'; var a = window.b = 5; })(); console.log(b);问题2: 创建 “原生(native)” 方法

在 String 对象上定义一个 repeatify 函数。这个函数接受一个整数参数,来明确字符串需要重复几次。这个函数要求字符串重复指定的次数。举个例子:

`console.log('hello'.repeatify(3));``

应该打印出 hellohellohello .

答案

一种可能的实现如下所示:

String.prototype.repeatify = String.prototype.repeatify || function(times) { var str = ''; for (var i = 0; i < times; i++) { str += this; } return str; };

这个问题测试了开发人员对于javascript中继承的掌握,以及 prototype 这个属性。这也验证了开发人员是否有能力扩展原生数据类型函数(虽然不应该这么做)。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评