您的位置:新葡亰496net > 服务器网络 > js问答十题,JavaScript高等篇之函数

js问答十题,JavaScript高等篇之函数

发布时间:2019-11-24 05:33编辑:服务器网络浏览(155)

    Javascript基本概念

    1. [] [] 'foo'.split(''); ['1'] 'foo'.split('');

    一、基本的类的使用方法一:复制代码 代码如下:function sth // 构造函数 { this.a = a; this.fun = output; // 成员函数 }

    高级篇
    本节我将分享我对函数,嵌套函数,作为数据的函数,作为对象的函数等!
    1、函数的创建
    由于前面已经用了很多的函数,我就不在这里多分享了。
    2、嵌套函数
    function china()
    {
      function people()//嵌套函数,只有china用它
    {
    document.write("我的心愿是当杜甫,最近网上他的漫画,他活的好潇洒");
    }
    people();
    }
     3、函数的直接量
     Javascript允许函数用直接量来定义,说白了就是一个表达式,(匿名函数)。细节:匿名函数以后会用,要明白!
    function china(people) //函数声明
    {
     return peole;
    }
    var fun = function(people){return people;};//通过表达式声明。效果等同
    4、函数的参数(这里大家要注意)
    当你调用一个函数的参数少于声明的参数个数是,其它的参数就是一个undefined的值。
    //打印函数
    function displayArray(arr)
    {
    if(!arr)return;
    for(var num =0;num<arr.length;num )
    {
    document.write("Num is " arr[num] "t");
    }
    document.write(" " "<br />");
    }
    var array = [2,32,14,57,6];
    function borrowArray(from,/*optional*/to)
    {
    if(!to) to = []; //to = to||[] 效果是等同的
    for(var element in from) //使用枚举遍历数组
    to.push(from[element]);//将元素添加到数组
     return to;//返回
    }
    var returnnumber = borrowArray(array);//执行
    js问答十题,JavaScript高等篇之函数。displayArray(returnnumber);//打印
    //输出:Num is 2 Num is 32 Num is 14 Num is 57 Num is 6
    5、可变的参数(Arguments 对象)
    第一次看到这里我也晕了,怎么参数还变的呢,多白了,这个argument对象就是函数参数的管理者,比如你有一个函数,定义了3个参数,那argument就有一个和你定义的参数,一样的数据集。
     要注意:arguments标识符在函数体内才有效的。你也可以就把它当成是函数的属性吧!
    function checkArgument(x,y,z)
    {
    if(arguments.length != 3) throw new Error("参数不匹配"); //检查参数是否合法,挺好用吧!
    return x y z;
    }
    js问答十题,JavaScript高等篇之函数。下面的例子是一个比较数字大小的例子,参数是可以变的。
    function compareMaxNumber()
    {
    var temp = Number.NEGATIVE_INFINITY;//表示javascript最小的复数
    for(var arg=0;arg<arguments.length;arg )
    {
    if(arguments[arg]>temp) temp = arguments[arg];
    }
    return temp; //返回参数中最大的数字
    }
    document.write(compareMaxNumber(2,34,5,23,766,1000) "<br />");//这里的参数可以有很多,输出1000
     6、将对象属性作为参数
    function displayArray(arr) //打印函数
    {
    if(!arr)return;
    for(var num =0;num<arr.length;num )
    {
    document.write("Num is " arr[num] "t");
    }
    document.write(" " "<br />");
    }
    //
    function copyArray(from,from_start,to,to_start,length)//复制数组
    {
    for(var i = from_start; i <length;i )

    to.push(from[i]);//填充
    }
    return to;
    }
    //getArray 接受对象
    function getArray(objarray)
    {
    //再次封装,调用copyArray
     return copyArray(objarray.from,objarray.from_start ||0,objarray.to|| [],objarray.to_start ||0,objarray.length);//这里用了一点技巧。
    }
    var arr1 = [1,2,3,4,5];
    displayArray(getArray({from:arr1,length:4}));
    6、作为数据的函数
    function add(x,y){return x y;}
    function multply(x,y){return x*y;}
    function cut(x,y){return x -y ;}
    operator(operator1,operator2,operator3)//接收3个参数,可以把函数作为参数使用。
    {
    return operator1(operator2,operator3);//执行的是add();
    }
    document.write(operator(add,operator(multply,2,4),operator(cut,12,2)));//输出18了
    7、作为方法的函数
    这里说的方法不过就是把函数存储在对象的属性里面,然后通过属性来调用,函数可以赋给任何变量。
    var obj = {};
    function display() //(something) 带参数
    {
    return "Love";//something;
    }
    obj.method = display;//使用对象的直接量赋值。
    obj.method();//调用。obj.method("Love");
    其实javascript也引用了this关键字。大家要记住其实调用方法的对象就是this的值。Object.method(); 这里Object就是对象,自然也就this的值了。
    var privatename =
    {name:"Frank",
    age:21,
    sex:'男',
    display:function()
    {document.write("my name is:" this.name "t age :" this.age)}};
    privatename.display(); //输出 name is:Frank age :21
    8、构造函数
    构造函数是初始化一个对象的属性,并专门和new运算符一起使用的构造函数,new运算符创建一个对象,然后调用构造函数,把新创建的对象当this的值来传递,赋值。(要能理解)
    function createProperty(name,version)//构造函数
    {
    this.name = name;
    this.version = version;
    }
    var tools = new createProperty("Multply",1.0);初始化,工具的名称,版本
    9、定义函数的属性
    当你需要使用一个全局不变值时,使用Function对象的属性将会很方便(以后创建命名空间,类的属性,其实都是寄托在这个上面)
    createNamespace.name = "360buy.define";
    createNamespace.version = 1.2;
    function createNamespace()
    {
    document.write("名称空间:" createNamespace.name "版本:" createNamespace.version);
    }
    createNamespace();//输出:名称空间:360buy.define版本:1.2
    10、方法apply()和call()
    使用这两个方法可以像调用其它对象的方法一样调用函数,两个方法第一参数都是要调用的对象,后面的参数是要调用的函数参数。
    function applyCallOperator(args,args2)
    {
    document.write(args "<br />");
    }
    var objpeople = {};
    applyCallOperator.apply(objpeople.Frank,[3,4]);//等同 applyCallOperator.call(objpeople.Frank,3,4) 前面就多[]
    objpeople.Frank();

    JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,最初由Netscape公司创造出来,起名Live Script,它和Java的关系只有一个:名字比较像。使用它的目的是与HTML超文本标记语言、Java 脚本语言一起实现在一个Web页面中链接多个对象,与Web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或调入在标准的HTML语言中实现的。它的出现弥补了HTML语言的缺陷,它是Java与HTML折衷的选择。(注意,如同VBScript一样,JavaScript一样有服务器端版本)一、JavaScript的基本语法

    答:'f,o,o', '1f,o,o' split将字符串转化为数组,数组相加,是先将数组转化成字符串,然后进行字符串的连接。

    function output { document.write; }

    小结:这篇就像大家分享到这来吧,下一篇我们一起实现javascript类。

    0、引言

    1. new Array(5).toString();

    //调用var s = new sth; ouput; //如果output在sth之前就是错的

    摘自 ben2012  

    Javascript的语法基本上与Java一致,但是由于Javascript是一个弱类型的脚本语言,在程序编写的过程中会有一些不同。同时由于Javascript是基于对象的语言,注意不是面向对象的语言,所以它在对对象的支持上有一定缺陷,大家所熟悉的诸如对象继承,多态等面向对象语言所具有的基本特性在Javascript中只能通过一些变通手段来实现。然而,弱类型语言也有其优点,那就是简单性,Javascript中类型转化是非常方便的,一个String通过一个简单的加减操作就可以转化为Int(相当于调用了Integer.ParseInt,而且不会抛异常。Javascript作为一种解释性语言,还能使用在编译性语言C/C 、JAVA难以支持的eval语句。由于运行在沙箱中,Javascript运行时有很多的安全性限制。它不允许访问本地的硬盘,并不能将数据存入到服务器上,不允许对网络文档进行修改和删除,只能通过浏览器实现信息浏览或动态交互,从而有效地防止数据的丢失。 总体上来说,Javascript应该是优缺点兼备。 作为学过JAVA的软院本科生来说,学习Javascript并不困难。Javascript不像HTML、CSS这种经验性很强的的领域,一旦大家入门之后,剩余阶段的Javascript相关的学习很可能就是查阅资料而已。在这里我希望我所写的内容能够起到抛砖引玉的作用,为大家打下基础。以下内容主要是Javascript的入门知识,我会从关键字开始描述,强调关键字是为了让大家对Javascript的语法有比较全面的认识,可能大家在今后的开发中可能一直用不到其中的某些关键字,但我认为大家有必要了解一下,同时请留意其中标出的注意事项。随后将是在页面中加入脚本的四种方法。在“Javascript客户端编程”中,我将提及浏览器文档模型,其中会有如何寻找对象以及安装事件处理器的详细解说。最后我将在“Javascript样例”中给出一段核心代码的注解和三个样例。“Javascript学习资料”中有一些有用的书籍名,电子参考资料和相关网址,请留意其中的推荐参考资料和MLParser的使用指南。大家的对Javascript问题我将会在FAQ中给出解答。 第一次写,错误在所难免,恳请大家指正和谅解。 1、VAR

    答:",,,,"

    方法二:复制代码 代码如下:function sth { this.a = a; this.output = function() { document.write; } } var s = new sth; // 输出2 二、继承方法一:复制代码 代码如下:function A { this.x = x; }

    本节我将分享我对函数,嵌套函数,作为数据的函数,作为对象的函数等! 1、函数的创建 由于前面已经用了很多的函数,我就不在...

    var i = 5; var j = "hello world"; var k = document; for( var u = 0; ... ; ... ) { ... } function fun() { var v = document; ... } VAR的作用是声明变量,但是不通过VAR声明的变量也可以使用。 在BLOCK块括起来的的代码段)中用VAR声明的变量是局部变量,一旦出了BLOCK的范围,变量就会失效。例如在样例中的 u 和 v 变量,当程序流分别出了 FOR 和 FUNCTION 语句的范围之后 u 和 v 就成了未定义变量。 其他情况下用VAR声明或者通过未声明直接使用的变量都是全局变量。 在同一个范围中对同一个变量名不能用一次以上的VAR,即不可重复声明变量。 不同范围中声明的同名变量在Javascript中会相互隐藏,例如,有一个全局变量 variable,同时在程序段中还有一个局部变量 variable,那么你在程序中引用的变量实际上会是局部变量 variable 。 一个变量在赋值之后,其类型就转化为所赋值的类型。 从未声明过的变量值为 undefined 类型也为 undefined 。 变量的有效性是它的定义范围与定义语句出现的顺序无关。 function test(){ document.write ; // print "undefined" document.write ; // print "javas" , not "undefined" var odd = "javas" ; } 样例中虽然 odd 在 document.write 之后,但在程序被解释时 odd 就被初始化了,所以打印结果不是 "undefined" 而是odd被赋予的初始值。 2、IF-ELSE

    1. (true false ) > 2 true; true false > 2 true;

    function B { // 方法1 /* this.construct = A; this.construct; delete this.construct; */ // 方法2 //A.call; // 方法3 A.apply; // 亦可A.apply, 不过arguments参数顺序一定要对 this.y = y; this.print = function() { document.write("x = ", x, ", y = ", y); } }

    if{ rs = 5.56; } else if { rs = document; } else{ rs = "Hello world"; } IF-ELSE的用法与JAVA中的完全相同。 注意表达式中的中的“val rs > '1.2' "这在JAVA中是不允许出现的。 另外虽然Javascript不要求在每句语句之后加分号,但加上分号是良好的编程习惯。 在样例中出现的未声明就使用的变量的情况在Javascript中是允许的,他们将自动转化为全局变量。 Javascript是大小写敏感的,所以请注意关键字的大小写。 3、SWITCH

    答: false,false ' '(算术操作符)的优先级优于'>'(关系操作符)

    var b = new B;alert; // 输出false

    switch{ case 0: ch = "A" ; break; case 1: ch = "B" ; break; default: ch = "X" ; break; case 9: ch = "Y" ; break; } SWITCH的用法与JAVA中的完全相同。 CASE后跟的变量建议使用常量表达式,不要用浮点。 每个CASE结束时的BREAK语句通常不可少,除非想利用SWITCH的FALL-THROUGH来实现特定的功能。 DEFAULT语句可以放在SWITCH结构中的任意位置,可以于CASE语句交叉放置。 4、WHILE

    1. function a (x) {

    优点:可以实现多继承

    while{ if continue; i = 3 i; } WHILE的用法与JAVA中的完全相同。 如果是BOOL变量可以不写bool_var == true/false,直接使用即可。 CONTINE语句会使程序流跳过循环中剩余的语句,进入循环的下一次迭代。 在Javascript中也有带LABEL的BREAK和CONTINUE,用法与JAVA相同。 在写循环时,注意不要产生“死”循环。样例程序片断中的就是一个“死”循环。 5、DO-WHILE

      return x * 2;

    缺点: · 必须以构造函数方式使用 · 使用instanceof运算符运算此类继承结果为false

    do{ i -= 8; } while; DO-WHILE的用法与JAVA中的完全相同。 不要遗漏结尾WHILE之后的分号。 6、FOR

     }

    方法二:复制代码 代码如下:function A() {

    for (var i = 0; i < 8; i ){ document.writeln; } DO-WHILE的用法与JAVA中的完全相同。 不要在计数变量 i 之前加 int 类型标识符,Javascript是弱类型语言,加了 int 反倒会报语法错,但是可以用 var 使之成为局部变量。 FOR中分号之间的内容都可以空缺相当于while,其中也可以使用多句语句用逗号分隔。 7、FOR-IN

       var a;

    } A.prototype.x = 1; function B() {

    for { str_result = document [ ite ]; } FOR-IN控制语句在JAVA中不存在,它的作用有点类似JAVA中的 Iterator 接口描述的功能。在样例中,ite将遍历 docment 中所有的可遍历元素,每次迭代时,ite中会包含被遍历数组或对象的索引字符串,例如,textfield(如果你在页面中有一个元素的ID为textfield),或者像数字1、2、3。 引用对象中元素时使用关联数组的方式:数组名或对象名 [ 索引值 ],例子中用 document [ ite ] 表示 document 中索引为 ite 的元素。 使用FOR-IN的最大好处就是你不需要知道目标对象或者数组究竟有多少元素,以及其内部结构是怎么样的,就可以遍历其所有可遍历元素。 8、CONTINUE-BREAK

       alert(a);

    } B.prototype = new A(); // 不能带参数! B.prototype.y = 2; B.prototype.print = function() { document.write(this.x, ", ", this.y, "
    "); } var b = new B; document.write; // 输出true缺点: · 不能实现多继承 · 构造函数不带参数

    again: while { whie { break again; // continue again; } reap(); } i ; } CONTINUE-BREAK的用法与JAVA中的完全相同。 使用带Label的break或者continue可以在内外循环中进行跳转。 9、FUNCTION

    答: function a (x) {

    Tips

    function fun_1 { rs = arg1 arg2; return rs; } FUNCTION在Javascript中的写法与JAVA中的有很大的差异。 首先是参数类型的问题,参数前面不需要加任何类型描述,VAR也不能加。Javascript方法参数也有传值和传引用之分,规则与JAVA基本一致,具体请查阅相关资料。 其次是返回值,返回值的类型不需要标明,RETURN会返回相应的对象,若无RETURN的数据,则返回值为undefined。从这个意义上讲,FUNCTION总是有返回值的。 最后是参数个数的问题,参数列表并不限制实际传入函数的参数个数,它只是提供了一个访问参数的快捷方式,也就是说给了特定位置参数一个特定的名字。 sum = fun_1 ; 以上函数调用时只传给 fun_1 一个参数。那么此时 arg2 的值是什么呢?undefined,你猜对了。 我们可以把 fun_1 改成以下形式来应对这种情况。 function fun_2 { if arg1 = 0; if arg2 = 0; rs = arg1 arg2; return rs; } undefined在布尔表达式中相当于 false 。 好了,问题似乎解决了。可是如果我们要处理更多参数怎么办呢?例如以下函数调用所代表的情况。 sum = fun_2 ; 在函数内部有一个Arguments对象,它是一个参数数组,通过它可以访问到传入函数的所有参数。 根据这一特性我们把 fun_2 改成 fun_3。 function fun_3 () { rs = 0; for (var i = 0 ; i < Arguments.length; i ) { rs = parseInt; } return rs; } 注意:这里使用了parseInt而不是直接加法引起的隐式转化。这是因为隐式转化的要求过高,而且有可能把 rs 转化为其他内部类型。 0 "23a" = NaN;0 parseInt = 23 function Point { this.x = x; this.y = y; this.func = m_func; } function m_func { ... } var newPoint = new Point; newPoint.func( newPoint.x new Point.y); 任何一个函数都可以成为构造函数,在函数中的 this 关键字同JAVA中意义类似,但不完全相同。 通过 new 产生的对象最终会通过垃圾回收机制清除。 函数也是Javascript的内部类型之一,所以可以赋给某个变量,注意不要加 实际上也是一个操作符表示对函数的调用。 this.func = m_func; 表示把m_func函数赋给 this 的 func 成员变量。 this.func = m_func(); 表示把m_func函数调用的返回值赋给 this 的 func 成员变量。 对象成员访问与JAVA类似:对象名.成员名 为一个类添加新成员,只要给特定的成员名赋值即可,实际上全局变量或函数也就是顶级对象的成员属性和方法,从这个角度上来思考,大家就很容易理解我在VAR一节中描述的变量声明规则了。 在Javascript中函数既然被视作一个类型,那么函数的声明就会有与普通变量相似的方法: var my_func = new Function ("arg1", "arg2", ... , "argN", " var rs = arg1 arg2 ... argN; return rs; "); var my_func = function (arg1, arg2, ... , argN) { var rs = arg1 arg2 ... argN; return rs; }; 前者被称之为构造器法,后者被称之为直接量法。 10、PROTOTYPE

           return x * 2;

    通常使用混合模式,两者一起用复制代码 代码如下:function A { this.x = x; } A.prototype.printx = function() // 写到A类里面this.printx = function....也是可以的,下同{ document.write; } function B { A.call; this.y = y; } B.prototype = new A(); // 不能带参数! B.prototype.printxy = function() { document.write(this.x, ", ", this.y, "
    "); } var b = new B; // 输出1 b.printxy(); // 输出1, 2 document.write; // 输出true

    function Point { this.x = x; this.y = y; // this.func = m_func; } Point.prototype.func = m_func; Point.prototype.s_name = "Point"; function m_func { ... } new Point () ; var newPoint = new Point; newPoint.func( newPoint.x new Point.y); PROTOTYPE是原型的意思,我改变在第九节中 Point 的实现。把 m_func 赋给了Point的原型。 这一改变唯一的好处就是我们不用在每次调用 Point 函数都对 func 属性赋值了,func 属性被保存在 Point 的原型对象中,从而节省了内存空间。 Point 与 Point.prototype 的关系请查阅相关的资料,这里不再详述。 用PROTOTYPE可以实现JAVA中的静态变量和静态方法(由于某些浏览器实现在对象创建之后才创建它的原型对象,所以建议在使用原型对象中静态成员之前先调用一次构造器方法,如同样例中 new Point();语句,调用结束之后,无用对象将被回收,但其原型对象将继续驻留在内存中),在Javascript支持的有限的对象继承也与PROTOTYPE有一定联系。 11、ARRAY

      }

    三、类似静态成员函数的使用复制代码 代码如下:function sth { this.a = a; } sth.fun = function { document.write; } var s = new sth; // 输出2

    var arr_8 = new Array; var arr = new Array(); var arr_d = [ 1, 2, , 4 , .., "Hi", null, true, document ]; var arr_m = [ [ 1, 2, 3, 4 ], [ 5, 6, 7], [ 8 ] ]; arr_8[ 3 ] = "ABC"; arr[ 100 ] = 8.8888; arr_d[ 0 ] = "CDE"; arr_m[ 1 ][ 0 ]新葡亰496net, = "XYZ"; 数组的创建可以通过 new Array 的构造器方法。 或者是把[ 数据 , 数据 , ... , 数据]的数组直接量赋给变量,数据之间用逗号分隔,arr_d中蓝色的部分有两个连续的逗号表示第三个元素空缺,其值为 undefined。 构造器方法的样例: arr_8和arr ;数组直接量的样例: arr_d和arr_m 。 Javascript中的数组是动态数组,它将随着元素数量自动调节数组长度。 Javascript中的数组元素没有任何类型限制,未初始化的元素值为 undefined。 Javascript中的多维数组的实现与JAVA中的完全相同。arr_m中 [ 1, 2, 3, 4] 表示 arr_m[0]所指向的第二维数组的数据。 Javascript对数组的访问与JAVA中的完全相同。 var textfield = document.all[ "textfield" ]; document.all 是一个数组吗?不完全是。 那为什么我们可以用 “textfield” 来访问我们的对象呢? 这是因为以上我们所看到的是Javascript中非常特殊的用法——关联数组,也可以称之为索引器。 对象名[ "成员名" ] = 对象名.成员名 关联数组的使用,可以使某些操作从硬编码中解脱出来,使之更具有灵活性。请看下面一个例子。 假如我们在执行某个与对象相关的操作时需要靠外界输出才能确定调用的函数。 方案之一:SWITCH,每更改一个分支就需要更新该方法。 方案之二:对象 . 函数名();,语法错误。 方案之三:对象 [ 函数名字符串 ]();,好的。 方案之四:eval(对象名字符串 "." 函数名字符串 ";,也可以的。 关联数组的使用,使我们能够用字符串,数字或者其他的类型的变量作为索引来访问我们所需要访问的属性和方法。 在FOR-EACH中常常会用这种方法来遍历对象或数组属性和方法。 12、UNDEFINDED-NULL

    在预编译与执行的过程中,相当于先创建了一个存储空间为a(var a;的作用),之后将这个空间内容设置成了function函数的内容

    四、对象的释放复制代码 代码如下:var obj = new Object; // obj是引用obj = null; // 取消引用,会自动进行垃圾回收;如果需要根本释放此对象,要将它的所有引用都赋值为null

    undefined == null ? true undefined === null ? false undefined 表示所引用的对象未经定义。 null表示所引用的对象的值是空值。 在布尔表达式中它的作用基本与null一致,都表示 false。 13、TRY-CATCH-FINALLY-THROW

    1. var func = function h5course () {

    五、函数对象复制代码 代码如下:var v = new Function("arg1", "arg2", "document.write; // 定义一个函数对象,参数分别是arg1,arg2 v; // 将会输出3

    try{ throw new Error ; } catch{ document.writeln( e.name ":" e.message); } finally{ document.writeln; } TRY-CATCH-FINALLY-THROW的用法与JAVA中的完全相同。 这是Javascript 1.5才有的新特性,在早期的浏览器中可能不支持。目前常用的浏览器 IE6、NAV7、Opera、FireFox 1.0 都支持。 14、WITH

      alert(typeof h5course);

    六、回调函数复制代码 代码如下:function callback { func; } function fun { document.write; }//callback; // 这种做法不行 var func = new Function; // 当然也可以把func换成具体的执行代码,// 但是函数代码庞大了就最好这样做了 callback;

    function Point { this.x = x; this.y = y; } var newPoint = new Point; with { var sum = x y; } WITH的用法与DELPH中的完全相同。 由于使用了WITH,在其作用域中newPoint.x 和 newPoint.y 分别被简化为了 x 和 y 。 15、TYPEOF

     }

    七、函数的重载复制代码 代码如下:function fun() { switch { case 1: document.write; break; case 2: document.write(arguments[0] arguments[1]); break; default: document.write; break; } } fun;

    swich { case "String" : rs = "string" ; break; case "Object" : rs = "object" ; break; case "Number" : rs = "Number" ; break; defualt: rs = "Unknown Type" ; } TYPEOF的作用是返回变量中数据类型对应的字符串。 TYPEOF返回的字符串随着浏览器的不同会有一定的差异。二、在网页中使用JavaScript

     func();

    八、利用函数闭包实现有“静态变量”的函数复制代码 代码如下:function fun() { var v = 1; function fun2() { v; document.write; document.write; return v; } return fun2; } var func = fun; // 输出2 func; // 输出4

    1、链接标记的URL中

     alert(typeof h5course);

    Click Me Click Me 这种做法通常只在教学演试中使用。 HREF中的"Javascript : // "的协议头一定要加,其中可以写多句脚本,但不能写 RETURN 语句。 2、HTML标签的事件处理属性中

    答:function,undefined

    Click Me Too Click Me Too 这种做法比较简单,比较常用。return false 是为了禁止页面跳转。 通常 "Javascript : // "的协议头可以不加,简写为 onclick = "alert;return false;"。 3、页面的SCRIPT标签中

    函数h5course并非是创建在全局的功能函数,而是以函数字面量的形式,被赋值给了func,因此,在全局作用域的环境中,能够找到func,却不能找到h5course。

    ... Click Me Again Click Me Again 这种做法把脚本与HTML做了一定的分离,代码的整体结构比较良好。 在代码的周围加上是为了避免不支持脚本的浏览器把脚本当作普通文本输出。 与之作用类似的还有

     

    标签,

    1. var x = 1;

    标签在浏览器不支持脚本时显示出其中的提示性文字。

     if(function f () {}) {

    ... Click Me Nowww! Click Me Nowww ! 外部脚本就是把脚本保存在一个单独的 *.js 文件中,通过指定

       x = typeof f;

     }

     alert(x);

    答: 1undefined 当在if语句当中放置一个功能函数的时候,这个if语句是能够成立的,但是,这个函数并不会被定义。

    1. 闭包 function fun(n,o) {

          console.log(o);

          return {

          fun: function (m) {

            return fun(m,n);

          }

         };

        }

        var a = fun(0); a.fun(1); a.fun(2); a.fun(3);

        var b = fun(0).fun(1).fun(2).fun(3);

        var c = fun(0).fun(1); c.fun(2); c.fun(3);

    答:undefined 0 0 0

    undefined 0 1 2

    undefined 0 1 1

    执行fun时会返回一个函数,返回的函数中,使用了n这个变量,而n这个变量恰好是父级函数的形参,此时构成闭包,n这个变量并没有被释放,在第二次调用的时候,n使用的是第一次调用后得到的值,以此类推;

     

    1. var x = 1;

     var y = 2;

     function show () {

      var x = 3;

      return {

        x: x,

        fun: function (a, b) {

          x = a b;

        }

       }

      }

      var obj = show();

      obj.fun(x,y);

      console.log(obj.x);

      console.log(x);

    答:3 , 1 obj所得的是show函数的返回值,即return返回的对象,在调用obj的fun后obj这个对象的x被赋值为3,最后一句console输出的x是在全局作用域中的x因此返回的值应该是全局变量x

     

    1. 闭包

    var a = 0,

      b = 0;

    function A (a) {

      A = function (b) {

        alert(a b );

      }

      alert(a );

    }

    A(1);

    A(2);

    答:1,4 第一次调用A函数的时候,A函数被重新赋值为了function(b){alert(a b )};alert输出a后a的值加1,在初始化的A中,形参a其实是一个局部变量,当重置A函数的时候,新的A函数调用了原有A函数作用域中的局部变量a,构成了闭包,a这个局部变量被保存。

     

    1. var arr = [];

    arr[0] = 'a';

    arr[1] = 'b';

    arr.foo = 'c';

    alert(arr.length);

    arr.length = arr.foo.length;

    alert(arr.length);

    答: 2,3 数组与数组属性 arr.foo当中,foo为arr数组的一个属性,就像length一样

     

    本文由新葡亰496net发布于服务器网络,转载请注明出处:js问答十题,JavaScript高等篇之函数

    关键词: