eval( ) 方法是不能亂用的,在不適當的時候使用eval( ) 方法可能導致整個程式都會出問題的;
而new function( ) 就沒這麼大問題。雖然new function( ) 在任何情況下,構造的函數都是在全域範圍下直接工作的,但只作語法檢查的話,並不會因為範圍問題而產生意外結果,只要你不直接調用通過它構造的新函數。
在eval( ) 接受的參數前面增加“0,”
其實這是由於ie中存在一個bug。出於某種原因,如果你在ie 中想通過調用eval( ) 來動態地構造一個函數。
例如:
eval('(function(){ /* code here */ })');
在ie 中得到的返回將是undefined,而其它瀏覽器則會正確地返回這個新構造的函數的引用。
最簡單有效解決辦法是:在前邊加上“0,”,這樣就能在所有主流瀏覽器中相容。
例如:
eval('0,function(){ /* code here */ }');
註:在ie9 的chakra 引擎中,這個問題已經解決。
使用數組對象的concat方法來產生新數組
把單個對象參數轉化為只包含一個元素的數組再來處理,可以使用“[ ].concat(o)”的形式。
例如:
複製代碼 代碼如下:
var arr1 = [1,2];
var arr2 = [3,4];
var arr3 = arr1.concat(arr2);
alert(arr3.length);
另一種方式是:if (!(o instanceof array)) o = [o];
// 和ecmascript 5 中的isarray 相比不夠嚴謹。
網友回複:
1.eval 確實不能亂用;
2.在ie eval 的時候,我的解決方案是在執行函數體內return ;
3.array.prototype.concat.apply([1,2,3],[4,5,6]);
補充說明
在js中 function下面二點要注意
1:
function 語句 在解析時會發生提升的情況,這意味著不管function
被他放置在哪,它會被他移到被定義時所在的範圍的頂層
2
一個語句不能以一個函數運算式開頭,因為官方的文法假定以單詞function 開頭的語句是一個function 語句,解決方案是把函數運算式括在一個園中回括弧之中
new
網頁特效 的new 運算子建立一個繼承於其運算數的原型的新對象,然後調用該運算數,把新建立的對象綁定給this,這個運算數(它應該是一個構造器函數)一個機會在返回給要求者前去自訂建立的對象
如果沒有new 運算子,你所做就是普通人的函數調用,並且把this綁定到全域對象(window)
void
void 是一個運算子,它接受受一個運算數並返回undefined 應該儘可能不用它
例子
1
var foo01 = function() {
var temp = 100;
this.temp = 200;
return temp + this.temp;
}
2
var foo02 = new function()
{
var temp = 100;
this.temp = 200;
return temp + this.temp;
}
3
var foo3 = new function(’var temp = 100; this.temp = 200; return temp + this.temp;’);
下面這種寫法效果是一樣的,但是注意了這裡有new關鍵字,而且不是function,而是function,比如說:
document.onmouseup=new function("flag=true");
第三種即最常見的一種,文法為:
function(){statement}
-----------------------------------
一.
var foo01 = function() {
var temp = 100;
this.temp = 200;
return temp + this.temp;
}
這裡重載了foo01函數,效果和function foo01(){statement}差不多,但是區別在於var foo01=function(){statement}重裝了foo01函數,也就相當於個模型,區別還是有的,比如說有個函數分別調用了這兩種方式寫的函數foo01,但是例子中的寫法將foo01的方法繼承了,但是function foo01(){}這種寫法則直接執行了函數,所以兩個寫法都很有用處。
二.
var foo02 = new function()
{
var temp = 100;
this.temp = 200;
return temp + this.temp;
}
這種寫法不常見,但是它和例一差不多,只不過多了關鍵字new,很明顯該函數必須先定義自訂函數的模型,然後才能對此函數用new關鍵字來執行個體化。
三.
var foo3 = new function(’var temp = 100; this.temp = 200; return temp + this.temp;’);
在上面已經提及過了。