第4天:function对象(案例:获取当前日期属于当年第几天、arguments对象、函数类型、参数、返回值、自身调用)
获取当前日期输入当年第几天
//输入,年月日,获取这个日期是这一年的第几天
//年-月--日:20171月31日
function getDay(year,month,day){
//定义变量存储对应的天数
var days=day
//如果用户输入的是一月份,没有必要向后算天数,直接返回天数
if(month==1){
return days;
}
//代码执行到这里--用户输入的不是1月份
//比如输入的是4月份23日---1,2,3,+23
//定义一个数组,存储每个月的天数
var months=[31,28,31,30,31,30,31,31,30,31,30,31];
//获取到当前数的第三个月(索引:0,1,2)所以i<month-1
for(var i=0;i<month-1;i++){
//将输入的天数相加到一起
days+=months[i]
}
//需要判断这个年份是不是闰年并且是否大于2
if(isLeapYear(year)&&month>2){
//那就在days加上1天
days++;
}
return days;
}
//判断这个年份是不是闰年
function isLeapYear(year){
return year%4==0&&year%100!=0||year%400==0;
} //2000年闰年31+29+2 62
console.log(getDay(2000,3,2));//
arguments对象:arguments
是一个对应于传递给函数的参数的类数组对象。
MDN:
arguments
对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments
对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:
arguments[0]
arguments[1]
arguments[2]
参数也可以被设置:
arguments[1] = 'new value';
arguments
对象不是一个 Array
。它类似于Array
,但除了length属性和索引元素之外没有任何Array
属性。例如,它没有 pop 方法。但是它可以被转换为一个真正的Array
:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments); // ES2015
const args = Array.from(arguments);
const args = [...arguments];
对参数使用slice会阻止某些JavaScript引擎中的优化 (比如 V8 - 更多信息)。如果你关心性能,尝试通过遍历arguments对象来构造一个新的数组。另一种方法是使用被忽视的Array
构造函数作为一个函数:
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
如果调用的参数多于正式声明接受的参数,则可以使用arguments
对象。这种技术对于可以传递可变数量的参数的函数很有用。使用 arguments.length
来确定传递给函数参数的个数,然后使用arguments
对象来处理每个参数。要确定函数签名中(输入)参数的数量,请使用Function.length
属性。
属性
arguments.callee
- 指向当前执行的函数。
arguments.caller
- 指向调用当前函数的函数。
arguments.length
- 指向传递给当前函数的参数数量。
arguments[@@iterator]
- 返回一个新的Array迭代器对象,该对象包含参数中每个索引的值。
-
function f1(){
//获取的是函数在调用的时候,传入了几个参数
console.log(arguments.length)
//使用arguments对象可以获取传入的每个参数的值
console.log(arguments)
}
f1(10,20,30,40);//调用 function f2(){
var sum=0;
arguments[1]=60;
for(var i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
console.log(f2(10,20,30,40,50))函数其他定义方式:
/*
*命名函数:函数如果有名字就是命名函数
*
*匿名函数:函数如果没有名字,就是匿名函数
*
*函数的另一种定义方式
*函数表达式
*把一个函数给一个变量,此时形成了函数表达式
*var 变量=匿名函数
*var f1=function(){
*
*}
*如果是函数表达式,那么此时前面的变量中存储的就是一个函数
*而这个变量就相当于是一个函数,就可以直接加小括号调用了
*
*注意:
*函数表达式后,要加分号;
*/
//将匿名函数给了变量
//函数表达式
var f2= function (){
console.log("匿名函数的调用")
}
f2();
//函数表达式
var f3= function (){
console.log("我是一个匿名函数")
}
// var f1=function f4(){console.log("萌萌啊")};
// f1();
//函数调用自身没有写出来
// (function(){console.log("萌萌啊");})();函数数据类型
function f1(){
console.log("我是函数");
}
//如何获取某个变量的类型?typeof
console.log(typeof f1)
//函数是有数据类型,数据类型:function类型的函数作为参数传递时
声明一个函数
function f1(){
console.log("这是一个函数")
} function f2(fn){
fn();//函数调用----说明fn变量中存储是一个函数
}
f2(f1) function sayHi(fn){
console.log("函数作为参数木有调用前")
fn();//当前fn变量存储的为一个函数
}
function mengSay(){
console.log("努力啊!小伙子");
}
sayHi(mengSay) //函数作为返回值使用
function fn(){
console.log("fn函数调用了");
return function (){
console.log("我是一个匿名函数");
}
}
//fn()//调用
var jieShou=fn();//将fn函数赋值给变量jieShou
jieShou();//实际调用函数js作用域
*全局变量:声明变量是使用var声明的,那么这个变量就是全局变量,全局变量*可以在页面的任何位置使用*除了函数以外,其他的任何位置定义的变量都是全局变量*局部变量:在函数内部定义的变量,是局部变量,外面不可以使用*全局变量如果页面不关闭,那么就不会释放,就会占空间,消耗内存****块级作用:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个*区域中使用,但是js中在这个块级作用域中定义的变量,外面也可以使用*说明:js中没有块级作用域,只有函数除外**隐式全局访问:声明的变量没有var,就叫隐式变量*全局变量是不能被删除,隐式全局变量是可以被删除*定义变量使用var是不会被删除的,没有var是可以删除的if(true){
var num=10;
}
console.log(num);//可以使用
for(var i=1;i<100;i++){
var number=100;
}
console.log(number);//可以使用
function f1(){
var ceShi=1000;
}
// console.log(ceShi)//不能使用
var num1=10;
num2=20;
delete num1;//不可以删除
delete num2;//可以删除
console.log(typeof num1);
console.log(num1+10);
console.log(typeof num2);作用域链:
//js作用域链
//从函数的作用域内开始,如果当前不存在变量,逐层向上找
//如f1函数中 f3函数如果找不到num;就会向上f2函数找num.....逐层 var num=10;
function f1(){
var num=20;
function f2(){
var num=30;
function f3(){
var num=40;
console.log(num)
}
}
}预解析
//预解析:提前解析代码
console.log(num);//undefined
//把变量的声明提前了
var num=10;预解析中,变量的提升,只会在当前作用域中提升,提前到当前作用域的最上面函数中的变量只会提前到函数的作用域中的最前面,不会出去预解析会分段,预解析的时候不同的script标签,同名的函数不会冲突function f1(){
console.log(num);//undefined;
var num=;
}
f1();
console.log(num);//not defined 没有定义运行结果:
预解析会将变量声明提前 函数声明提前
var a=25;
function add(){
// var a;
alert(a);//undefined 预解析会将变量声明提前 函数声明提前 即 var a;
var a=10;
}
add();
console.log(a)//25 第一个a是全局变量 可以访问 函数中的a作用域只在add函数中,不可以访问预解析会将变量a提前声明,同时也将函数a()提前声明,即a不会等于undefined,因为a重名,所以已经被函数a()覆盖(暂时这样理解)
console.log(a); // function a(){
// console.log("aaaaa");
// }
function a(){
console.log("aaaaa");
}
var a=1;
console.log(a);//预解析会先将变量提前声明,再到函数提前声明,根据作用域链(先作用域内查找变量再逐层向上)——————script标签内的变量先提前声明——————>再到函数提前声明————>函数内作用域:变量也会提前声明——————>一步一步结果如下:
var a=10;
//预解析
// var a; a=10
// function f1(){
// var b; var a;b=9;
// var b=9;
// console.log(a)//因为预解析
// console.log(b)
// var a="123";
// }
f1()
function f1(){
var b=9;
console.log(a)//因为预解析
console.log(b)
var a="123";
} f1();案例分析:局部变量和隐式变量
function f1(){
var a=b=c=9;
/*
var a;//函数内声明的 局部变量
a=9;
b=9;//隐式变量
c=9;//隐式变量
*/
console.log(a);//
console.log(b);//
console.log(c);//
}
f1();
console.log(a);// not definde 所以报错
console.log(b);//
console.log(c);////var f1;
f1();//不能调用
var f1=function (){//因为f1是变量 声明会提前
console.log(a);
var a=10;
}
第4天:function对象(案例:获取当前日期属于当年第几天、arguments对象、函数类型、参数、返回值、自身调用)的更多相关文章
- scala基础题--函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔
函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔 import scala.io.StdIn object work02 { def main(args: Array[St ...
- moment.js获取当前日期是当年的第几周
/** * 实现当前日期是当年的第几周,再向前和向后推几周 * js数组保存当前日期的前后两周(共五周的数据) * */ var initSearchMajorChanges = function() ...
- function 中定义函数的默认返回值,
result有默认值的int类型的为0,string类型的为‘’,tobject类型的为nil等等
- Python3基础 Python的函数都有返回值 无指定返回值的函数 返回NONE对象
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- JavaScript中的内置对象-8--4.date对象中-获取,设置日期时间的方法; 获取,设置年月日时分秒及星期的方法;
学习目标 1.掌握创建日期对象的方法 2.掌握date对象中获取日期时间的方法 3.掌握date对象中设置日期时间的方法 如何创建一个日期对象 语法:new Date(); 功能:创建一个日期时间对象 ...
- java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】
转: java.lang.reflect.Method.getAnnotation()方法示例 java.lang.reflect.Method.getAnnotation(Class <T&g ...
- springmvc下js控制表单提交(表单提交前检验,提交后获取json返回值)
这个问题我搞了四天,终于搞懂.因为对js很不熟悉.郁闷的是后台代码出错总可以设置断点调试,前端js代码出错只能通过浏览器提供一些运行数据来分析,很不习惯. 首先说下逻辑:这是一个注册功能,我希望,注册 ...
- SpringMVC(二)返回值设置、数据在域中的保存与SpringMVC案例
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.返回值的设置 1.返回 String [1]返回 String 默认情况 @RequestMappi ...
- 使用 arguments 对象
arguments 对象表示参数集合,它是一个伪类数组,拥有与数组相似的结构,可以通过数组下标的形式访问函数实参值,但是没有基础 Array 的原型方法. //函数没有定义形参,但是在函数体内通过 a ...
随机推荐
- javaweb报错:java.lang.NumberFormatException: null
报错环境: JSP向Severlet页面传值,当Serverlet页执行以下语句时,后台日志报错 int softType = Integer.parseInt(request.getParamete ...
- day03.1-函数编程
python中函数的定义: def test (x,y): "The function definitions" z = x**y return z ""&qu ...
- “全栈2019”Java第二十四章:流程控制语句中决策语句switch下篇
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 模拟实现strstr和strrstr
strstr函数用于判断str2是否是str1的子串,如果是,则返回str2在str1中首次出现位置的地址,如果不是则返回NULL.其模拟实现代码如下:#include<iostream> ...
- python difflib详解
difflib -帮助进行差异化比较 这个模块提供的类和方法用来进行差异化比较,它能够生成文本或者html格式的差异化比较结果,如果需要比较目录的不同,可以使用filecmp模块. class dif ...
- 亿级 Elasticsearch 性能优化
前言 最近一年使用 Elasticsearch 完成亿级别日志搜索平台「ELK」,亿级别的分布式跟踪系统.在设计这些系统的过程中,底层都是采用 Elasticsearch 来做数据的存储,并且数据量都 ...
- editplus5注册码
注册码:Vovan 3AG46-JJ48E-CEACC-8E6EW-ECUAW
- BZOJ - 3166 可持久化Trie 维护次大区间
题意:给出\(a[1...n]\),找出一个连续区间\(a[l...r],r>l\),令该区间的次大值为\(a_k\),使得\(a_k⊕a_i,l≤i≤r\)最大,输出全局最优解 (这题意有点别 ...
- chromedriver for mac
- Jmeter使用指南----压力测试工具
来源: https://blog.csdn.net/u012111923/article/details/80705141 https://www.cnblogs.com/st-leslie/p/51 ...