*自定义Function
自定义Function:函数,也称之为方法,是需要提前预定义好的,以后可以反复使用的代码段
1、*创建函数的方式:2种
1、*声明方式:function 函数名(形参列表){ - 不是人人都有声明方式,但是有声明方式的人一定优先用声明方式,因为最简单,只有三个人具有声明方式:变量、常量、函数
函数体;
return 返回值;
}
2、直接量方式:- 大部分人直接量就是最简单的创建方式了
var 函数名=function(形参列表){
函数体;
return 返回值;
}
return的本意,退出函数的意思
只不过如果return后面跟着一个数据,会顺便将其返回到全局作用域之中,但是只负责返回不负责保存!
所以再调用函数时,如果有return,记得拿一个变量接住他
2、*作用域:2种
一、全局作用域:成员:全局变量和全局函数,在任何位置都可以访问|使用
二、函数/局部作用域:成员:局部变量和局部函数,只能在【函数调用时内部可用】
带来了变量得使用规则:优先使用局部的,局部没有找全局,全局没有就报错
特殊:
1、千万不要对着未声明的变量直接赋值:a=1; - 会导致全局污染,全局本来没有,突然就被添加上了一坨内存,建议任何变量使用之前一定要先var
2、儿子不孝啊,局部的东西全局居然不能用,解决:看上面,
3、哪怕没有写return,其实也会悄悄给你return一个undefined,默认
4、return一般只会出现再函数的最后,而且只能出现一次
5、其实前辈们提供给我们的方法,大部分底层都有return操作,因为前辈们考虑到了,调用了他这个方法过后得到的结果可能对我们以后有用
3、*声明提前:笔试重点 - 祖师爷留下的一个问题
在程序正式执行之前
会将var声明的变量和function声明的函数
集中提前到当前作用域的顶部,但是赋值留在原地
变量比函数轻
我们写代码绝对不会碰到,只要遵守规则:1、先创建后使用 2、变量名和函数名尽量的不要重复
只会在鄙视中碰到:如果以后你碰到先使用后创建,多半都是在靠你声明提前
声明提前笔试题
<script>
var a = 1;
function f1() {
console.log(a);
var a = 100;
console.log(a);
}
f1();
console.log(a);
var a = 1;
function f1() {
console.log(a);
a = 100;
console.log(a);
}
f1();
console.log(a);
function f1() {
console.log(1);
}
f1();
function f1() {
console.log(2);
}
f1();
var f1 = 100;
f1();
var f1;
function f1() {
console.log(1);
}
function f1() {
console.log(2);
}
f1();
f1();
f1 = 100;
f1();
var f1 = function () {
console.log(1);
}
f1();
function f1() {
console.log(2);
}
f1();
var f1 = function () {
console.log(3);
}
f1();
var f1;
var f1;
function f1() {
console.log(2);
}
f1 = function () {
console.log(1);
}
f1();
f1();
f1 = function () {
console.log(3);
}
f1();
var fn = function () {
console.log(1);
}
fn();
function fn() {
console.log(2);
}
fn();
var fn = 100;
function fn() {
console.log(3);
}
fn();
var fn;
var fn;
function fn() {
console.log(2);
}
function fn() {
console.log(3);
}
fn = function () {
console.log(1);
}
fn();
fn();
fn = 100;
fn();
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();
fn = function () {
console.log(2);
}
fn = function () {
console.log(4);
}
fn();
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);
var a;
function f1() {
console.log(a);
a = 20;
console.log(a);
}
console.log(a);
a = 10;
f1();
console.log(a);
a = 100;
console.log(a);
</script>
4、*按值传递:
如果传递的是【原始类型的值】
修改一个变量,另一个变量是不会受到影响的,其实是复制了一个【副本】给对方
如果传递的是【引用类型的对象】:Array、Function
修改一个变量,另一个变量是会受到影响的,因为两者使用的是【同一个地址值】 - 浅拷贝:好像是复制了,但是复制的不全
预定义全局函数
预定义全局函数:前辈们提前创建好的,我们可以直接使用的,在哪里都可以使用
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(变量/表达式){
case 值1:
操作1;
case 值2:
操作2;
default:
默认操作
}
特殊:1、case 的比较不带隐式转换
2、问题:默认只要一个case满足后,会将后面所有的操作全部做完
解决:break;
建议:每一个case的操作后都跟上一个break
有的地方也可以不加break:
1、最后一个操作default可以省略break
2、如果中间多个操作做的事儿是一样,可以省略中间部分
3、default可以省略不写,但如果条件都不满足,则什么都不会执行
面试题:if vs switch
1、switch...case...,缺点:必须要知道最后的结果是什么才可以使用,在case中不能做范围判断,只能做等值判断
优点:执行效率相对较高
2、if:缺点:执行效率相对较低
优点:可以随意的做范围判断
建议:代码优化时,要尽量的将所有的 if...else... 换成 switch...case...