A. 一段文字,每個字有不同的顏色javascript函數代碼怎麼寫
/* 隨機獲取顏色 */
function getColor()
{
return (
function(m,s,c)
{
return (c>0 ? arguments.callee(m,s,c-1): '#') + s[m.floor(m.random() * 16)]
}
)(Math, ['1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f'], 5);
}
var _str = "每個字的顏色都不一樣?sdna,sjdansdnasdlhasdnas,dmas,das,'jqlwjkqlwjqlwjewq;alsdfjafa,as da,sdn alsd hasldhalsd halsdk asldkjasld alskd alsdkj alsdk alsdk alskd jalasdklj alkd asl;d jasldj asldk jaklsdj als;kdj as.";
var arr = _str.split("");
var str = "";
for(var i=0,len=arr.length; i<len; i++)
{
str += '<span style="color:'+getColor()+';">'+arr[i]+"</span>";
}
B. js中變數後面有個問號是什麼意思
這個是三元操作符,它在每一種語言中的功能和語法都是一樣的專。
舉例:int a=3;int b=5;
int c= a>b?1:0;
解釋:a大於屬的話,c就等於1,否則的話c等於0;
?是判斷的意思,: 是否則的意思。
(2)javascriptcallee擴展閱讀:
三元操作符格式
如名字表示的三元運算符需要三個操作數。
語法為:條件表達式?表達式1:表達式2。
說明:問號前面的位置是判斷的條件,判斷結果為bool型,為true時調用表達式1,為false時調用表達式2。
其邏輯為:「如果條件表達式成立或者滿足則執行表達式1,否則執行第二個。」常用在設置默認值,例如某個值不一定存在,則判斷這個值是否存在,不存在給默認值(表達式2)。
C. js嚴格模式為什麼要禁用callee
早起版本的 JavaScript 沒有具名函數表達式(named function expression),所以在函數表達式里么沒有辦法實現遞歸。
比如下面實現階乘的函數:
functionfactorial(n){
return!(n>1)?1:factorial(n-1)*n;}[1,2,3,4,5].map(factorial);
如果寫成函數表達式的話:
[1,2,3,4,5].map(function(n){
//這里要怎樣遞歸?
});
所以添加了 arguments.callee 來實現對執行函數本身的調用:
[1,2,3,4,5].map(function(n){
return!(n>1)?1:arguments.callee(n-1)*n;
});
但是現在的JavaScript 支持了具名函數表達式:
[1,2,3,4,5].map(functionfactorial(n){
return!(n>1)?1:factorial(n-1)*n;
});
這樣寫有以下的好處:
可以像正常一樣調用函數
不會在函數外面的作用域創建變數(IE8或者更早的瀏覽器還是會)
比起用 arguments 對象來說,性能更加優秀
同時,使用 arguments.callee 還會帶來函數引用優化問題和尾遞歸優化的問題。
以上部分內容資料來自:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript
D. 關於JavaScript中argument.caller的理解問題!謝謝!
首先要分清caller和callee,arguments.callee返回當前正在執行的函數,function.caller返回函數的調用體所在函數。
隨便弄了個示例代碼
functionparentCheck(){
check("");
functioncheck(){
subCheck();
functionsubCheck(){
console.log(arguments.callee);
console.log(subCheck.caller.caller)
}
}
}
parentCheck();
arguments.callee返回subCheck的函數體,subCheck.caller返回調用subCheck的函數,即check,而再往上一層,subCheck.caller.caller就是返回調用check的函數體,也就是parentCheck。那如果是繼續往上一層呢?subCheck.caller.caller.caller?就會變成null。書里也有講,arguments.caller在非嚴格模式下永遠是undefined。我們就可以判斷值是null還是undefined來區分arguments.caller和函數的caller。
JS的函數是可以無限嵌套的,就構成了一棵樹,而function.caller就提供了一個訪問父節點的方法,通過靈活應用function.caller,我們甚至可以用腳本畫出整棵樹,只要我們在任意地方成功插入一段JS代碼,又或者是,像網站統計之類的第三方代碼,我們就能窺視其他代碼。
所以為了安全期間,嚴格模式禁止調用caller、callee、arguments變數,在瀏覽器中的報錯為
UncaughtTypeError:'caller','callee',and'arguments'rcallstothem
個人敝見,無書可循,希望對您有幫助
E. javascript中,用什麼方法能夠在本函數內部獲取到自己的函數名
arguments.callee 為指向自己的函數,可想相面這樣實現遞歸的軟編碼,樓上說的ie不支專持是ie不支持函數的name屬性
functionrecursion(){
auruments.callee();
}
但是在ES5嚴格屬模式中這種方式不再被支持
F. javascript關於arguments.callee
arguments.length 是實參長度
arguments.callee.length 是形參長度
這里有個簡單的例子,是比較參數的版長權度的:
function test(x,y,z)
{
checkArgu(arguments);
return x+y+z;
}
function checkArgu(argu)
{
var argu_test1, argu_test2;
argu_test1 = argu.length;
argu_test2 = argu.callee.length;
if(argu_test1 == argu_test2)
alert("yes");
else
alert("no");
}
test(1,2,3);
test(1,2,3,4);