JavaScript day007

94 阅读4分钟

*自定义Function

自定义Function:函数,也称之为方法,是需要提前预定义好的,以后可以反复使用的代码段

1、*创建函数的方式:2种

1、*声明方式:function 函数名(形参列表){ - 不是人人都有声明方式,但是有声明方式的人一定优先用声明方式,因为最简单,只有三个人具有声明方式:变量、常量、函数
			函数体;
			return 返回值;
		         }

2、直接量方式:- 大部分人直接量就是最简单的创建方式了
			var 函数名=function(形参列表){//通过此处看出函数名其实也是一个变量名,衍生出,elem.on事件名这一坨其实就是函数名,无非涨得长了点
				函数体;
				return 返回值;
			}

return的本意,退出函数的意思
只不过如果return后面跟着一个数据,会顺便将其返回到全局作用域之中,但是只负责返回不负责保存!
所以再调用函数时,如果有return,记得拿一个变量接住他

2、*作用域:2种

一、全局作用域:成员:全局变量和全局函数,在任何位置都可以访问|使用

二、函数/局部作用域:成员:局部变量和局部函数,只能在【函数调用时内部可用】
带来了变量得使用规则:优先使用局部的,局部没有找全局,全局没有就报错
特殊:
1、千万不要对着未声明的变量直接赋值:a=1; - 会导致全局污染,全局本来没有,突然就被添加上了一坨内存,建议任何变量使用之前一定要先var

2、儿子不孝啊,局部的东西全局居然不能用,解决:看上面,

3、哪怕没有写return,其实也会悄悄给你return一个undefined,默认

4return一般只会出现再函数的最后,而且只能出现一次

5、其实前辈们提供给我们的方法,大部分底层都有return操作,因为前辈们考虑到了,调用了他这个方法过后得到的结果可能对我们以后有用

3、*声明提前:笔试重点 - 祖师爷留下的一个问题

在程序正式执行之前
会将var声明的变量和function声明的函数
集中提前到当前作用域的顶部,但是赋值留在原地
变量比函数轻

我们写代码绝对不会碰到,只要遵守规则:1、先创建后使用 2、变量名和函数名尽量的不要重复
只会在鄙视中碰到:如果以后你碰到先使用后创建,多半都是在靠你声明提前

 声明提前笔试题
 <script>
        //笔试题1
        var a = 1;
        function f1() {
            console.log(a);
            var a = 100;
            console.log(a);
        }
        f1();
        console.log(a);
        //笔试题1做法
        var a = 1;
        function f1() {
            //var a;
            console.log(a);//unbdfined
            a = 100;
            console.log(a);//100
        }
        f1();
        console.log(a);//1

        //笔试题2
        function f1() {
            console.log(1);
        }
        f1();
        function f1() {
            console.log(2);
        }
        f1();
        var f1 = 100;
        f1();

        //笔试题2做法
        var f1;
        function f1() {
            console.log(1);
        }
        function f1() {
            console.log(2);
        }
        f1();//2

        f1();//2
        f1 = 100;
        f1();//f1被修改是一个数字 不再是一个函数所以没办法使用() 报错

        //笔试题3
        var f1 = function () {
            console.log(1);
        }
        f1();
        function f1() {
            console.log(2);
        }
        f1();
        var f1 = function () {
            console.log(3);
        }
        f1();

        //笔试题3做法
        var f1;
        var f1;
        function f1() {
            console.log(2);
        }

        f1 = function () {
            console.log(1);
        }
        f1();//1

        f1();//1
        f1 = function () {
            console.log(3);
        }
        f1();//3

        //笔试题4
        var fn = function () {
            console.log(1);
        }
        fn();
        function fn() {
            console.log(2);
        }
        fn();
        var fn = 100;
        function fn() {
            console.log(3);
        }
        fn();

        //笔试题4作法
        var fn;
        var fn;
        function fn() {
            console.log(2);
        }
        function fn() {
            console.log(3);
        }
        fn = function () {
            console.log(1);
        }
        fn();//1

        fn();//1
        fn = 100;
        fn();//报错

        //笔试题5
        function fn() {
            console.log(1);
        }
        fn();
        var fn = function () {
            console.log(2);
        }
        function fn() {
            console.log(3);
        }
        var fn = function () {
            console.log(4);
        }
        fn();

        //笔试题作法
        var fn;
        var fn;
        function fn() {
            console.log(1);
        }
        function fn() {
            console.log(3);
        }
        fn();//3
        fn = function () {
            console.log(2);
        }
        fn = function () {
            console.log(4);
        }
        fn();//4

        //笔试题6
        function f1() {
            console.log(a);
            a = 20;
            console.log(a);
        }
        console.log(a);
        var a = 10;
        f1();
        console.log(a);
        a = 100;
        console.log(a);

        //笔试题6做法:注意代码的执行数据
        var a;
        function f1() {
            console.log(a);//10
            a = 20;//修改全局20
            console.log(a);//20
        }
        console.log(a);//报错
        a = 10;
        f1();//调用
        console.log(a);//全局的20
        a = 100;
        console.log(a);//修改了全局100
</script>

4、*按值传递:

	如果传递的是【原始类型的值】
		修改一个变量,另一个变量是不会受到影响的,其实是复制了一个【副本】给对方

	如果传递的是【引用类型的对象】:ArrayFunction
		修改一个变量,另一个变量是会受到影响的,因为两者使用的是【同一个地址值】 - 浅拷贝:好像是复制了,但是复制的不全

预定义全局函数

预定义全局函数:前辈们提前创建好的,我们可以直接使用的,在哪里都可以使用

1、编码和解码:- 玩玩悄悄话

问题:
url中不允许出现多字节字符,如果出现会乱码
utf-8编码格式下,一个汉字,占3字节
解决:发送前,前端将用户输入的多字节字符编码为单字节字符(符号、字母)
发送后,后端将单字节字符解码为多字节原文

编码:var code=encodeURIComponent("原文");
解码:var 原文=decodeURIComponent(code);
其实百度根本就没做这个操作,这个东西在某次浏览器更新后,就自带此功能了,当场就淘汰了

2、isFinite(num)

isFinite(num); 判断num是不是无穷大,true->有效数字  false->无穷大
哪些会为false:NaN,分母为0(java就会错),Infinity

3、牛逼的

parseInt/Float/isNaN/eval()

分支结构

分支结构:根据条件,选择一部分代码执行
switch分支 if分支
语法:
       switch(变量/表达式){
			case1:
			操作1;
			case2:
			操作2;
			default:
			默认操作
		                }
特殊:1case 的比较不带隐式转换
	 2、问题:默认只要一个case满足后,会将后面所有的操作全部做完

解决:break;

建议:每一个case的操作后都跟上一个break

有的地方也可以不加break:
1、最后一个操作default可以省略break
2、如果中间多个操作做的事儿是一样,可以省略中间部分
3default可以省略不写,但如果条件都不满足,则什么都不会执行

面试题:if vs switch

1switch...case...,缺点:必须要知道最后的结果是什么才可以使用,在case中不能做范围判断,只能做等值判断
优点:执行效率相对较高

2if:缺点:执行效率相对较低
 优点:可以随意的做范围判断

建议:代码优化时,要尽量的将所有的 if...else... 换成 switch...case...