常用的JavaScript设计模式
-
单体模式
-
工厂模式
-
例模式
函数
-
函数的定义
-
局部变量和全局变量
-
返回值
-
匿名函数
-
自运行函数
-
闭包
作用域链
var num=10;`` function f1() { `` var num=20; `` function f2() { `` var num=30; `` function f3() { `` var num=50; `` console.log(num); `` }
f3();`` }
f2();`` }
f1();
03 函数案例
求2个数中的最大值
function getMax(num1, num2) {`` return num1 > num2 ? num1 : num2; `` }
console.log(getMax(10,20));`` //console.log(getMax);//函数的代码
function getMax(num1, num2) {`` return num1 > num2 ? num1 : num2; `` }
var num1=10;`` var num2=20; `` //函数外面的num1和函数的形参num1不是同一个变量
var result=getMax(num1,num2);`` console.log(result); ``console.log(getMax);//函数的代码
求3个数中的最大值
function getThreeMax(x, y, z) {`` return x > y ? (x > z ? x : z) : (y > z ? y : z); `` }
console.log(getThreeMax(10,2,24));
判断一个数是否是素数(质数),只能被1和自身整除,质数是从2开始
用这个数字和这个数字前面的所有的数字整除一次(没有1的,没有自身的)
function isPrimeNumber(num) {`` for (var i = 2; i < num; i++) { `` if (num % i == 0) { `` //说明有一个数字整除了,就没有必要向后继续整除了,
//此时就已经验证出不是质数
return false;`` }
}
return true;`` }``// console.log(isPrimeNumber(7) ? "yyyyyes" : "nnnnnno")
var aa = isPrimeNumber(17);`` if (aa) { `` console.log("yes"); `` } else { `` console.log("no"); `` }
function isPrimeNumber(num) {`` for(var i=2;i<num;i++){ `` if(num%i==0){ `` //说明有一个数字整除了,就没有必要向后继续整除了,此时就已经验证出不是质数
return false;`` }
}
return true;`` }
console.log(isPrimeNumber(8)?"是质数":"不是质数");
var result=isPrimeNumber(2);`` if(result){ `` console.log("这个数字是质数"); `` }else{ `` console.log("这个数字不是质数"); `` }
function aaa(x,y){`` return x-y; `` }
console.log(aaa(99,88))
通过函数实现数组反转
function reverseArray(arr) {`` for (var i = 0; i < arr.length / 2; i++) { `` var temp = arr[i]; `` arr[i] = arr[arr.length - 1 - i]; `` arr[arr.length - 1 - i] = temp; `` }
return arr;`` }
console.log(reverseArray([1, 2, 3, 4, 5]));
通过函数实现冒泡排序
function sortArray(arr) {`` //控制比较的轮数
for (var i = 0; i < arr.length - 1; i++) {`` //控制每一轮的比较次数
for (var j = 0; j < arr.length - 1 - i; j++) {`` if (arr[j] > arr[j + 1]) { `` var temp = arr[j]; `` arr[j] = arr[j + 1]; `` arr[j + 1] = temp; `` }//end if
}//end for
}//end for
return arr;
}
console.log(sortArray([0, 19, 34, 10, 100, 2]));
求一个数字的阶乘
function getJieCheng(num) { `` var result = 1; `` for (var i = 1; i <= num; i++) { `` result *= i; `` }
return result;
}``console.log(getJieCheng(5));//1*2*3*4*5
求斐波那契数列
function getFib(num){`` var num1=1; `` var num2=1; `` var num3=0; `` for(var i=3;i<=nnum;i++){ `` sum=num1+num2; `` num1=num2; `` num2=sum; `` }
return sum;`` }
console.log(getFib(12))
02 函数作为参数使用
函数是有数据类型,数据类型:是function类型的
函数可以作为参数使用,如果一个函数作为参数,那么我们说这个参数(函数)可以叫回调函数 只要是看到一个函数作为参数使用了,那就是回调函数
function sayHi(fn) {
console.log(“GOOD”); fn();//fn此时应该是一个函数
}function suSay() {
console.log(“HELLO”);
}sayHi(suSay);` `function f1(x,y) {
console.log(x+y);
}f1(10,20);` `function f2(x,y) {
console.log(x+y);
}f2("HLS","MISS");` `function f3(x) {
console.log(x);
}``f3(true);
04 arguments
计算n个数字的和
定义一个函数,如果不确定用户是否传入了参数,或者说不知道用户传了几个参数,没办法计算,但是如果在函数中知道了参数的个数,等于也知道了每个参数的值.
//定义``function f1() { `` //获取的是函数在调用的时候,传入了几个参数
//console.log(arguments.length);`` //使用arguments对象可以获取传入的每个参数的值
console.log(arguments);
}
f1(10,20,30,40,100,200);//调用
function f1() {`` //arguments----->数组使用------伪数组---
var sum=0;`` for(var i=0;i<arguments.length;i++){ `` sum+=arguments[i]; `` }
return sum;
}
console.log(f1(10,20,30));
05 预解析:提前解析代码
预解析:**就是在解析代码之前,**预解析做什么事?
把变量的声明提前了----提前到当前所在的作用域的最上面
函数的声明也会被提前—提前到当前所在的作用域的最上面
函数调用的时候, 把会函数的声明提升到作用域的上面
函数的声明提升到作用域
f1();//调用`` var num=20;//这个变量的声明会提升到变量使用之前 `` function f1() { `` console.log(num); ``//var num=10;
}
function f1() {``console.log("小苏好猥琐");
}
f1();`` function f1() { `` console.log("小苏没有助教猥琐"); `` }
f1();
把变量的声明提前
var num;`` console.log(num); `` num=10; `` function f1() { `` console.log("哈哈,助教好猥琐哦"); `` }
//f1();//报错
注意:预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面
function f1() {`` console.log(num);//undefined `` var num = 10; `` }
f1();
console.log(num);//报错
函数中的变量只会**提前到函数的作用域中的最前面,**不会出去
预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
function f1() {`` console.log(num);//undefined `` var num=10;
}
f1();
console.log(num);//
function f1() {
console.log("哈哈");
}
HTTP
-
HTTP 报文结构是怎样的?
-
HTTP有哪些请求方法?
-
GET 和 POST 有什么区别?
-
如何理解 URI?
-
如何理解 HTTP 状态码?
-
简要概括一下 HTTP 的特点?HTTP 有哪些缺点?
-
对 Accept 系列字段了解多少?
-
对于定长和不定长的数据,HTTP 是怎么传输的?
-
HTTP 如何处理大文件的传输?
-
HTTP 中如何处理表单数据的提交?
-
HTTP1.1 如何解决 HTTP 的队头阻塞问题?
-
对 Cookie 了解多少?
-
如何理解 HTTP 代理?
-
如何理解 HTTP 缓存及缓存代理?
-
为什么产生代理缓存?
-
源服务器的缓存控制
-
客户端的缓存控制
-
什么是跨域?浏览器如何拦截响应?如何解决?