批改状态:合格
老师批语:再复杂的技术,其实都可以用一二句话说明白
js:前端通用的脚步语言
<!-- js:前端通用的脚本 语言 --><!-- 运行在前端的js --><h2>www.php.cn</h2><!-- <button onClick="alert(1)">Button1</button> --><!-- 1. 内联脚本 --><button onclick="document.querySelector('h2').classList.toggle('active');">Button1</button><!-- 2. 内部脚本 --><button onclick="activeTitle(this)">Button2</button><script>function activeTitle() {document.querySelector("h2").classList.toggle("active");}</script><!-- 3. 外部脚本 --><!-- 使用外部脚本 浏览器可以缓存,可以共享,推荐使用此方法 --><script src="outjs.js"></script>
总结: 1. 事件属性:内联脚本 2. script 标签中:内部脚本 3. script 标签的 src 属性中:外部脚本
<script>// 1. 变量// 声明let userName;console.log(userName);let itemName = "手机";console.log(itemName);userName = "percy";console.log(userName);// 2. 常量// 声明是必须初始化const unitPrice = 3699;console.log(unitPrice);//3. 标识符// 字母,数字,下划线,$;且不能用数字开始// 严格区分大小写 userName,username 不是同一个变量// 不得使用关键字和保留字// 4. 命名方案// 驼峰式:userName(小驼峰)// pascal:UserName(大驼峰)// 匈牙利式:oBtn,_sex,_salary (首字母小写表示变量类型,第二个单词开始首字母大写)// js中推荐全部使用驼峰式,方法和函数使用Pascal,常量全部使用大写</script>
总结:
变量用:let
常量用:const
尽量不要用 var
标识符只能用字母,数字,下划线,$;且不能用数字开始
使用小驼峰命名方案
<script>let o = null;console.log(o, typeof o);// 如何判断一个值是否是null呢? ===if (o === null) console.log("null");</script>
<script>let arr = [100, "phone", 6699];console.log(arr);console.log(arr instanceof Array);console.log(arr instanceof Object);// 怎么判断一个变量是数组呢?console.log(Array.isArray(arr));let items = {id: 100,name: "phone",price: 6899,};console.log(items);console.table(items);// 判断是否是对象console.log(items instanceof Object);// 函数function show() {console.log(typeof num);}console.log(typeof show);</script>
总结:
判断是否是数组:Array.isArray(arr)
判断是否是对象:instanceof Object
<script>// 函数声明// 命名规则 函数命名:动词 + 名词,变量和常量命名用名词function getName(name) {return name + " Welcome ";}// 调用console.log(getName("yp"));// 函数提升 :调用可以在函数声明之前书写// 声明会自动提升到顶部function getName(name) {return " 欢迎 " + name;}// 1. 避免函数提升,写到匿名函数中(函数表达式)let sum = function (a, b) {return a + b;};// 2. 避免函数被重写:// 将函数做为值,赋值给一个常量const sum1 = function (a, b) {return a + b;};console.log(sum1(1, 2));</script>
// 必选参数let sum = function (a, b) {return a + b;};console.log(sum(1, 2));console.log(sum(1));//可选参数,设置默认值sum = function (a, b = 0) {return a + b;};console.log(sum(1));console.log(sum(1, 4));sum = function (a, b, c, d) {return a + b + c + d;};console.log(sum(1, 2, 3, 4));// ... :归内参数,简化函数的参数声明// 当参数比较多时可使用sum = function (...arr) {console.log(arr);console.log(arguments);// arguments 类数组:类似数组其实是对象// 属性为从0递增的正整数,且有length 属性// reduce()操作数组所以要转换// Array.from(arguments) 可以将类数组转化为数组console.log(Array.from(arguments));// return arr.reduce(function (p, c) {// return p + c;// });// 简化为箭头函数// return arr.reduce((prev,curr)=>prev+curr);return Array.from(arguments).reduce((prev, curr) => prev + curr);// Array.of() 将独立元素封装成数组console.log(Array.of(...arguments));};console.log(sum(1, 2, 3, 6));let params = [1, 2, 3, 4, 5, 6];console.log(params);// ...:扩展参数,简化函数的调用参数console.log(sum(...params));// 函数都是单值返回 迭代器例外,如果想返回多个值,将结果封装到数组或对象中// let getItems = function () {// return [100, "phone", 6899];// };// 使用箭头函数简写let getItems = () => [100, "phone", 6899];console.log(getItems());// 返回带有描述的内容就使用对象// getItems = function(){// return {id:100,name:"phone",price:6899};// }// 使用箭头函数简写getItems = () => {return { id: 100, name: "phone", price: 6899 };};console.log(getItems());
高阶函数:使用函数为参数或者将函数作为返回值的函数
// 1. 回调函数:自己不用给别人用的函数// document.addEventListener("click",function () {// alert("hello ...");// })// 使用箭头函数简写document.addEventListener("click", () => alert("~~~world"));// 2. 偏函数:当函数的参数比较多时,先传入必要的参数,其他更多的函数用函数的返回值传递// 简化了声明时的参数// let sum = function (a, b) {// return function (c, d) {// return a + b + c + d;// };// };// 使用箭头函数简写let sum = (a, b) => (c, d) => a + b + c + d;// 调用// let f1=sum(1,2);// console.log(f1(3,4));console.log(sum(1, 2)(3, 4));// 柯里化(极端的偏函数) 简化了调用的参数// sum = function (a) {// return function (b) {// return function (c) {// return function (d) {// return a + b + c + d;// };// };// };// };// 使用箭头函数简写sum = (a) => (b) => (c) => (d) => a + b + c + d;// 简化调用console.log(sum(1)(2)(3)(40));// 4. 纯函数// 完全独立于调用的上下文,返回值只能受到传入的参数影响// function getDate () {// return Date.now();// }// 使用箭头函数简写getDate = () => Date.now();// 以上不是纯函数console.log(getDate());
箭头函数用来简化“匿名函数”的声明
如果函数体只有一条语句,可不写 return 和大括号
如果只有一个参数,小括号都可以不写
如果没有参数,小括号不能省
箭头函数没有原型属性 prototype,不能当构造函数用
箭头函数中的 this,始终与它的上下文绑定
let sum = function (a, b) {return a + b;};//使用箭头函数简写sum = (a, b) => a + b;console.log(sum(3, 4));let tips = (str) => console.log(str);tips("欢迎新同学");
js 使用词法作用域或者叫静态作用域,总是和他的使用上下文绑定
js 三种作用域:全局,函数,块
// 1. 全局作用域:写在外面就是全局作用域let title = "php ";console.log(title);// 2. 函数作用域:写在函数内function getSite() {// 函数内声明的变量是私有变量// 函数中可以使用他的上下文的变量let domain = "www.php.cn";return title + domain;}console.log(getSite());// 3. 块作用域{let a = 1;const b = "hello";var c = 2;}// console.log(a,b);// 以后尽量不用var,因为var不支持块作用域console.log(c);// 4. 闭包:能够访问自由变量的函数// 自由变量: 既不是函数的参数也是私有变量,存在于函数调用上下文中// 非函数本身定义,而是上下文中的变量(可理解为父级中的变量)let num = 1;function add(a, b) {let t = 0;// t是私有变量,a,b是参数,num就是自由变量return t + a + b + num;}function a() {let n = 100;// 这个返回的子函数就是闭包;闭包就是子函数return function () {return n;};}// 使用箭头函数简写getNum = () => {let n = 200;return () => n;};console.log(a()());console.log(getNum()());addNum = () => {let n = 1;return () => n++;};console.log(addNum()());console.log(addNum()());console.log(addNum()());console.log("----------------");let f1 = addNum();console.log(f1());console.log(f1());console.log(f1());
立即执行函数:IIFE
立即执行:声明完直接调用
有什么用处呢?可以模拟块作用域。
//立即执行函数:IIFEfunction sum(a, b) {console.log(a + b);}sum(10, 20);//立即执行:声明完直接调用(function sum(a, b) {console.log(a + b);})(10, 30);((a, b) => console.log(a + b))(10, 40);//用处?可以模拟块作用域// if (true) {// let b=888;// }// console.log(b);//失败是因为let 声明的块作用域//制作模块let module = (function (name, email) {return {getName: () => "name:" + email,getEmail: () => "email:" + email,};})("admin", "admin@php.cn");console.log(module.getName());
总结:
回调函数:简而言之是自己的函数写好为别人服务提供服务器
纯函数:返回值只受到参数影响,不受上下文影响;
js知识点很多,仅用这些做入门三板斧吧。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号