JavaScript笔记(二)

 

这篇记录函数的用法

标准函数定义:

    function sum(a, b) { 

var c = a + b; 

return c;

}

其中a和b叫做函数的参数,函数体内return c是将c作为返回值(如果没有显式的return,默认返回undefined),虽然函数只声明了两个参数,实际上调用的时候可以传入任意数量的参数,比如:sum(1,2,3,4,5),每个函数都会默认创建一个arguments变量,类似一个数组,可通过下标访问所有的参数

 

预定义的函数:

下面这些函数都是黑盒,无法查看内部实现代码

parseInt()

尝试把任意类型转换成整数,如果转换失败,返回NaN

一些示例:

parseInt('123') >>>123

parseInt('abc123') >>>NaN

parseInt('1abc23') >>>1

parseInt('123abc') >>>123

 

第二个参数表示进制

parseInt('FF', 10) >>>NaN

parseInt('FF', 16) >>>255 //十六进制

parseInt('0377', 10) >>>377

parseInt('0377', 8) >>>255 //八进制

 

对于0开头的字符串,parseInt会默认把它当成8进制转换,如:

parseInt('0377') >>>255

对于0x开头的字符串,parseInt会默认把它当成十六进制进行转换,如:

parseInt('0x377') >>>887

 

parseFloat()

尝试把参数转换成小数,只有1个参数,转换失败会返回NaN

区别:

parseInt("1.9")>>>1    parseFloat("1.9")>>>9

parseInt("1e2")>>>1    parseFloat("1e2")>>>100

parseFloat('1.23abc.00')>>>1.23

parseFloat('a.bc1.23') >>>NaN

 

isNaN()

判断参数是不是数字,如果不是数字,返回false,可以用来判断parseInt和parseFloat是否转换成功。

isNaN(NaN) >>>true

isNaN(123) >>>false

isNaN(1.23) >>>false

isNaN(parseInt('abc123')) >>>true

这个函数会尝试转换参数:

isNaN('1.23') >>>false

isNaN('a1.23') >>>true

isNaN('1px')>>>true //严格匹配,parseInt和parseFloat可以转换,但isNaN不认为它是个数字

因为NaN==NaN返回false,所以这个函数非常有用。

 

isFinite()

判断参数是一个数字,而不是Infinity或NaN

isFinite(Infinity) >>>false

与isNaN类似,它也会尝试转换字符串

isFinite("0">>>true

 

 

encodeURI() /encodeURIComponent() decodeURI() /decodeURIComponent() 

encodeURI会把参数当作一个完整的URI字符串处理

encodeURIComponent()会把参数当作URI的一部分,比如查询部分,所以所有的特殊字符都会被encode

 

eval()

将参数当作一段javascript执行,不建议使用,会有性能和安全问题

 

 

 

变量作用域

js中没有块作用域(不同于java),只有函数作用域和全局作用域

在函数内部定义的变量只有函数内或此函数的私有函数能访问,外部不能访问,如:

    var global = 1;

    function f() { 

var local = 2; 

global++; 

return global;

}

global是全局的,在f内也可以访问,但是local是在f内定义的,不能被外部访问

 

注意,如果不小心丢掉了var关键字,local会被分配为全局变量

 

 

函数内的变量声明会覆盖全局声明:

var a = 123;

function f() { 

alert(a); //undefined

var a = 1; 

alert(a); //1

    f(); 

 

 

 

 

函数也是数据(变量),两种定义方式:

    function f(){return 1;} //函数声明

var f = function(){return 1;} //函数表达式

typeof f>>>"function"

完全可以把函数当作普通变量处理,让一个新变量指向它,当作参数传递,当作返回值,或者干脆delete f

 

匿名函数:

~function(a){alert(a)}(1);//定义一个匿名函数并马上执行它

 

私有函数

    function a(param) { 

function b(theinput) { 

return theinput * 2; 

}; 

return 'The result is ' + b(param);

};

其中b就是一个private function

或者用函数表达式的方式:

    var a = function(param) { 

  var b = function(theinput) { 

return theinput * 2; 

}; 

return 'The result is ' + b(param);

};

 

 

综合应用,重写自己:

function a() { 

alert('A!'); 

a = function(){ 

alert('B!'); 

};

    }

只有第一次执行a时才会alert('A!'); 适合做一些只做一次的初始化工作

 

或者:

var a = function() { 

function someSetup(){ 

var setup = 'done'; //马上会被执行,因为函数最后有一对小括号

function actualWork() { 

alert('Worky-worky'); 

someSetup(); 

return actualWork;

    }();

 

闭包

关于闭包的概念,网上有很多介绍的很多,在这不解释意义了,来几个例子,加深印象:

1、

function f(){ 

var b = "b"; 

return function(){ 

return b; 

}

    }

想在外部访问f的内部变量b,可以:

var n=f();

var b=n();

或者:

var n;

function f(){ 

var b = "b"; 

n = function(){ //n在外部声明

return b; 

}

    }

 

2、

function f(arg) { 

var n = function(){ 

return arg; 

}; 

arg++; 

return n;

    }

var m = f(123);

m();//结果是124

 

3、

function f() { 

var a = []; 

var i; 

for(i = 0; i < 3; i++) { 

a[i] = function(){ 

return i; 

return a;

    }

var a = f();

a[0]()=3,a[1]()=3,a[2]()=3

修正一下:

function f() { 

var a = []; 

var i; 

for(i = 0; i < 3; i++) { 

a[i] = (function(x){ 

return function(){ 

return x; 

})(i); 

return a;

    }

var a = f();

a[0]()=0,a[1]()=1,a[2]()=2

 

或者:

function f() { function makeClosure(x) { return function(){ return x; } } var a = []; var i; for(i = 0; i < 3; i++) { a[i] = makeClosure(i); } return a; }

 
以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值