(100分)js中的变态语法

bsnry 2017-09-28 08:54:15
function fun()
{

}

function fun2()
{

}

function fun3()
{

}

function fun4(fun, fun2, fun3)
{
console.log("--------");

}


console.log("xxxxxxxxx");
fun4();


1. 居然可以运行,也不会报错;;

2. function fun4(fun, fun2, fun3) 这个中的fun2 和function fun2的关系是什么?

js引擎认为 fun2和function fun2()
{

}

的关系是什么?

谢谢。
...全文
444 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
当作看不见 2017-09-29
  • 打赏
  • 举报
回复
对于js来说,支持函数式编程 ,函数是一等公民 ,函数和其他任何类型的参数一样都只是一个变量而已. var x = function(){ } x 首先是一个变量,再是一个函数, new Function(); 可以看出函数是一个对象,其实一点都不变态,只是不熟悉这种语法而已 看看下面这种语法 ,这才是日了狗 ,另外js 确实有很多坑. ({}= {}) new Array(1,2);是拥有成员数字1,数字2的一个数组,new Array(2); 确是一个长度为2 的空数组 ,也就是无法用new Array()声明一个长度为1 ,成员为数字的数组 例如类数组成员, document.getElementsByTagName(); 获取到的是类数组成员 ,有length 属性,可以for循环遍历,能通过 [1] 来获取某个具体的元素,但是不是数组,由于没有数组的forEach 等方法,split 等, ................就不多举例了,反正这个是非常正常的,而且其他语言中也有,但是js的坑很多,但不包含这个
Hello World, 2017-09-29
  • 打赏
  • 举报
回复
JS不检查参数个数,有传入就取传入值,没有就是未定义,相当于多态吧
lifewell1 2017-09-29
  • 打赏
  • 举报
回复
没有关系 function fun4(fun, fun2, fun3) 里面的只是个参数而已 作用域也只在fun4中 与函数fun无关 js有个特点 只关注函数名 不关注参数 fun4(fun, fun2, fun3)表示最多可以接受3个参数 你可以fun4() 也可以fun4(1) 也可以fun(1,2,3,4,5)单最多只能取前三个参数
似梦飞花 2017-09-29
  • 打赏
  • 举报
回复
形参而已 没关系 可以传入函数 类似c++里的函数指针 还是指针函数来着
x80819091 2017-09-29
  • 打赏
  • 举报
回复
js可能有一些莫名其妙的地方,但大部分只是你不了解他而已
tong-wl 2017-09-29
  • 打赏
  • 举报
回复
问题2:2. function fun4(fun, fun2, fun3) 这个中的fun2 和function fun2的关系是什么? 问的有点小白呀 function fun2(){ } 表示定义了一个fun2的函数,和var a=2;没有区别,只是一个定义的是一个fun2的函数,一个定义的是a这个num类型。 fun4(fun2); fun4(a); 上述两个fun4的调用,fun2和a处于同等定位,都是作为一个实参;那fun2和定义的function fun2(){}什么关系?? 那你这里将fun2作为一个参数传给fun4函数,你不把fun2定义起来,你怎么传?你传什么???就是 var a=1;你不定义一下,你凭什么 fun4(a); js引擎认为 fun2和function fun2(){} 的关系是什么? js引擎不想这么多...楼主问的感觉好高大上呀~~~~就是你定义了一个fun2函数,fun4(fun2)的时候拿来用了而已。
tong-wl 2017-09-29
  • 打赏
  • 举报
回复
问题1:我觉得这是js语言对函数定义的机制之一,我认为这是一个js的优点,你书写了 function fun4(fun, fun2, fun3) { console.log("--------"); } 这仅仅是一个对fun4的定义,你fun4();就去调用了fun4这个函数,你并没有传入参数,为什么不报错?我觉得没有为什么,JS就这样定义的,有它的好处,楼主参考下面的例子: 假设有个需求,定义一个函数,这个函数实现打印传入的所有参数,可能换个语言(比如java),就实现不了,因为用户传几个参数都不知道,打印什么,js能够实现: function consoleAll(){ //我这里并没有任何的形参,其实在js中,function定义的形参就是一个别名,方便使用,arguments数组和形参对应 for(var i= 0,len=arguments.length;i<len;i++){ console.log(arguments[i]); } } consoleAll(1,2,3,4); consoleAll(1,2,3,4,45,234,12,234,234); consoleAll(1,2,3,4,45,34,34,34,34,34,213312312,undefined,123); 换个简单例子: function test(name,age){ console.log(name); //对应arguments[0],name就是arguments[0]的别名,你在写代码的时候,写一个name这种参数,既有语义意义,又写起来简单一些吧 console.log(age); //对应arguments[1],age就是arguments[1]的别名 console.log(arguments[2]); //我即使没有形参,但是我能通过arguments[2]获取到实参 } test("tongwl",18,3);
x80819091 2017-09-29
  • 打赏
  • 举报
回复
这个东西在c#,java这种语言叫委托,不知道有什么不合理的地方。 而且fun,fun2,fun3..都只是参数,和你前面的定义的fun(){}..没有关系,除非你运行fun4(fun,fun2,fun3)
clark_kidd 2017-09-29
  • 打赏
  • 举报
回复
并不莫名其妙啊,楼主学过vb语法没有?vb函数参数前带 optional 意味着参数是可选的,js只是所有参数都可选而已,并没什么稀奇的啊

public sub fun(optional byval s as string = "")
end sub
//调用时,fun() 或者 fun("") 都可以
你理解js函数的所有参数都是optional就好了 你可以理解 fun2 是 function fun2() 的一个地址(这在C#里写成 addressof fun2) 简单做个测试 function fun2(){ alert(1); } var address_of_fun2 = fun2; address_of_fun2();//有了函数地址,加个()就可以调用了
cuihu811371804 2017-09-29
  • 打赏
  • 举报
回复
看到你第二个回复,首先,如果说参数的事,大可不必和用函数做参数扯上关系,比照cpp中有默认参数和方法重载而c中无类似技术,说明其实函数的参数实际并不是确定函数调用的必要条件(因为可以利用参数来确定函数)),本质上还是一个指针的利用,而js中,函数与参数彻底无联系(也就是不能方法重载,当然,也没有类机制,es5),对js中函数形参可以一个不写,而在内部使用arguments来获取实参(效率较低),所以,检查参数这种事,js是不会做的,js唯一关心的是函数标识符(也就是函数名),而关于函数作为参数等问题,我上面提过,js中函数可以动态定义,这看起很容易忽略,换个说法就是函数可以在函数内部定义(而不是调用),这就稍微复杂了一些,但我觉得你其实实际上应该关注这个问题,理解这一点比理解为何js对形参不作检查之类更重要(检查形参只不过是内存节约时代的一种抠门表现,实际上是不合理的)
trainee 2017-09-29
  • 打赏
  • 举报
回复
第2个问题: 没关系 函数定义时的参数名 和外面的变量没关系, 其他语言也是一样的 定义了函数, 调用的时候如果没指定参数, js会认为传入一个undefined变量 所以执行fun4(); 就相当于执行 fun4(undefined,undefined,undefined) 但如果执行fun4(fun, fun2, fun3, fun) 就会出错, 因为它找不到4个参数的fun4
bsnry 2017-09-29
  • 打赏
  • 举报
回复
引用 1 楼 cuihu811371804 的回复:
。。不知道你有没有c基础,函数指针做参数很正常,js中函数,和你这种类似但更好的例子是可以return f,接受这个return再调用,函数名说白了无非是存储指向定义该函数代码的指针而已(这样的描述可能不大准确,但js中函数是可以动态定义的,这区别于c中的静态定义),所以,函数名可以就理解为一个变量而已,只是要用时在这个变量后加上一对括号
第2个问题: js引擎认为 function fun4(fun, fun2, fun3) { console.log("--------"); } 的第2个参数 fun2 和 和function fun2() { } 是什么关系?谢谢。
bsnry 2017-09-29
  • 打赏
  • 举报
回复
引用 1 楼 cuihu811371804 的回复:
。。不知道你有没有c基础,函数指针做参数很正常,js中函数,和你这种类似但更好的例子是可以return f,接受这个return再调用,函数名说白了无非是存储指向定义该函数代码的指针而已(这样的描述可能不大准确,但js中函数是可以动态定义的,这区别于c中的静态定义),所以,函数名可以就理解为一个变量而已,只是要用时在这个变量后加上一对括号
你好,你没有看懂我的问题所在。 c我是学过的,我的问题并不是———————— 函数作为一个参数, 函数名在c/c++中作为参数,会转换为函数指针,这个是我知道的。 我的问题是在: function fun4(fun, fun2, fun3) { console.log("--------"); } 有3个参数,而我一个参数都不传入,也能运行,我知道js是动态弱类型语言,但是js对参数不检查达到了令人发指的程度。 而且函数指针的类型也没有检查,比如:该函数指针有几个参数? 参数类型。
cuihu811371804 2017-09-29
  • 打赏
  • 举报
回复
。。不知道你有没有c基础,函数指针做参数很正常,js中函数,和你这种类似但更好的例子是可以return f,接受这个return再调用,函数名说白了无非是存储指向定义该函数代码的指针而已(这样的描述可能不大准确,但js中函数是可以动态定义的,这区别于c中的静态定义),所以,函数名可以就理解为一个变量而已,只是要用时在这个变量后加上一对括号

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧