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);