1. var obj = {a : 1}; (function (obj) { obj = {a : 2}; })(obj);? ?? ? //問obj的值會改變嗎晋涣?
var obj = {a : 1};
(function (obj) {
????obj = {a : 2};
})(obj);
//問obj的值會改變嗎澈段?
外部的obj不變.
因為匿名函數(shù)中obj傳入?yún)?shù)等于是創(chuàng)建了一個局部變量obj, 里面的obj指向了一個新的對象 . 如果改成(function () { obj = {a : 2}; })(obj);??就會改變了
2. var obj = { a:1,??func: function() { (function () { a=2; }(); }} ; obj.func()? ?? ? //obj中a的值會改變嗎? 匿名函數(shù)里的this指向的是什么?
var obj = {
????a:1, ?
????func: function() {
????????(function () {
????????????a=2;
????????}();
????}
} ;
obj.func();
//obj中a的值會改變嗎? 匿名函數(shù)里的this指向的是什么?
obj里的a不會變. 匿名函數(shù)里的this指向全局對象window.??這等于是給window加了一個名為a的屬性
要改變obj中a的值 , 應(yīng)當(dāng):
(function() {
????this.a = 2
}).call(this);
或者obj中定義?
func: function() {
????var self = this;
????(function(){
????????self.a=2;
})();}
3. 要實現(xiàn)函數(shù)內(nèi)每隔5秒調(diào)用自己這個函數(shù)窑滞,100次以后停止令宿,怎么辦?
(function(){
var index = 0;
function fn(){
if(index < 100){
????index++;
????setTimeout(function(){
???? fn();
},5000); ??
??? }
}
fn();
})();
4. 點擊一個ul的五個li元素,分別彈出他們的序號管嬉,怎么做地技?
方法1 :
var oLi = document.getElementsByTagName('li');
for(var i=0; i<oLis.length; i++){
????oLis[i].onclick = (function(j){
????????return function(){
????????????alert(j);
????????}
????})(i);
}
方法2:
var oLi = document.getElementsByTagName('li');
for(var i=0; i<oLi.length; i++){
????(function(j){
????????oLi[j].onclick = function(){
????????????alert(j);
????????};
????})(i);
}
方法3:
var oLi = document.getElementsByTagName('li');
for(var i=0; i<oLi.length; i++){
????oLi[i].index = i;
????oLi[i].onclick = function(){
????????alert(this.index);
????}
}
5. js實現(xiàn)數(shù)組去重怎么實現(xiàn)?
方法1.?創(chuàng)建一個新的臨時數(shù)組來保存數(shù)組中已有的元素
var a = new Array(1,2,2,2,2,5,3,2,9,5,6,3);
Array.prototype.unique1 = function(){
????var n = []; ????//一個新的臨時數(shù)組
????for(var i=0; i<this.length; i++){
????????//如果把當(dāng)前數(shù)組的第i已經(jīng)保存進了臨時數(shù)組, 那么跳過
????????if(n.indexOf(this[i]) == -1){
????????????n.push(this[i]);
????????}
????}
????return n;
}
console.log(a.unique1());
方法2.?使用哈希表存儲已有的元素
Array.prototype.unique2 = function(){
????var hash = {},
????????n = []; ????//hash 作為哈希表, n為臨時數(shù)組
????for(var i=0; i<this.length; i++){
????????if(!hash[this[i]]){ ????????//如果hash表中沒有當(dāng)前項
????????????hash[this[i]] = true; ??//存入hash表
????????????n.push(this[i]); ???????//當(dāng)前元素push到臨時數(shù)組中
????????}
????}
????return n;
}
方法3.?使用indexOf判斷數(shù)組元素第一次出現(xiàn)的位置是否為當(dāng)前位置
Array.prototype.unique3 = function(){
????var n = [this[0]];
????for(var i=1; i<this.length; i++) ???//從第二項開始遍歷
????{
????????//如果當(dāng)前數(shù)組元素在數(shù)組中出現(xiàn)的第一次的位置不是i
????????//說明是重復(fù)元素
????????if(this.indexOf(this[i]) == i){
????????????n.push(this[i]);
????????}
????}
????return n;
}
方法4.?先排序再去重
Array.prototype.unique4 = function(){
????this.sort(function(a, b){ return a - b;});
????var n = [this[0]];
????for(var i=1; i<this.length; i++){
????????if(this[i] != this[i-1]){
????????????n.push(this[i]);
????????}
????}
????return n;
}
第一種方法和第三種方法都使用了indexOf(), 這個函數(shù)的執(zhí)行機制也會遍歷數(shù)組
第二種方法使用了一個哈希表, 是最快的.?
第三種方法也有一個排序的復(fù)雜度的計算.
然后做了個測試, 隨機生成100萬個0-1000的數(shù)組結(jié)果如下:
第三種方法總是第二種方法的將近兩倍, 而第四種方法與數(shù)組的范圍有關(guān),
如果是0-100的數(shù)組
而如果是0-10000, 方法四看著就效果還不錯了
而第二種方法永遠(yuǎn)是最好的, 但是是以空間換時間
全部代碼如下
var a = [];
for(var i=0; i<1000000; i++){
????a.push(Math.ceil(Math.random()*10000));
}
?
Array.prototype.unique1 = function(){
????var n = []; ????//一個新的臨時數(shù)組
????for(var i=0; i<this.length; i++){
????????//如果把當(dāng)前數(shù)組的第i已經(jīng)保存進了臨時數(shù)組, 那么跳過
????????if(n.indexOf(this[i]) == -1){
????????????n.push(this[i]);
????????}
????}
????return n;
}
?
Array.prototype.unique2 = function(){
????var hash = {},
????????n = []; ????//hash 作為哈希表, n為臨時數(shù)組
????for(var i=0; i<this.length; i++){
????????if(!hash[this[i]]){ ????????//如果hash表中沒有當(dāng)前項
????????????hash[this[i]] = true; ??//存入hash表
????????????n.push(this[i]); ???????//當(dāng)前元素push到臨時數(shù)組中
????????}
????}
????return n;
}
?
Array.prototype.unique3 = function(){
????var n = [this[0]];
????for(var i=1; i<this.length; i++) ???//從第二項開始遍歷
????{
????????//如果當(dāng)前數(shù)組元素在數(shù)組中出現(xiàn)的第一次的位置不是i
????????//說明是重復(fù)元素
????????if(this.indexOf(this[i]) == i){
????????????n.push(this[i]);
????????}
????}
????return n;
}
?
Array.prototype.unique4 = function(){
????this.sort(function(a, b){ return a - b;});
????var n = [this[0]];
????for(var i=1; i<this.length; i++){
????????if(this[i] != this[i-1]){
????????????n.push(this[i]);
????????}
????}
????return n;
}
var begin1 = new Date();
a.unique1();
var end1 = new Date();
?
var begin2 = new Date();
a.unique2();
var end2 = new Date();
?
var begin3 = new Date();
a.unique3();
var end3 = new Date();
?
var begin4 = new Date();
a.unique4();
var end4 = new Date();
?
console.log("方法一執(zhí)行時間:" + (end1 - begin1));
console.log("方法二執(zhí)行時間:" + (end2 - begin2));
console.log("方法三執(zhí)行時間:" + (end3 - begin3));
console.log("方法四執(zhí)行時間:" + (end4 - begin4));