JavaScript嵌套函数问题:移除字符串首尾字符遇传参障碍
问题分析与解决方案
嘿,我来帮你揪出问题所在!你的代码核心问题出在**变量遮蔽(variable shadowing)**上——你在内部函数popLast里声明了和外部同名的参数splitStr,这就导致内部函数里的splitStr和你外面从字符串转来的那个数组不是同一个东西啦!
咱们拆解一下:
- 外部的
splitStr是你用str.split("")生成的目标数组,本来是要操作它的; - 但你给内部函数
popLast加了splitStr参数,这会在内部函数的作用域里创建一个全新的局部变量,直接覆盖了外部的同名变量。如果调用popLast时没传参数,这个局部的splitStr就是undefined,调用pop()自然会报错;就算传了参数,也未必是你原本想操作的那个数组。
修正后的代码方案
方案一:移除内部函数的参数,直接访问外部数组
把内部函数的splitStr参数删掉,让它直接使用外部作用域的数组:
let str = 'example'; let removeChar = function(str){ let splitStr = str.split(""); // 去掉内部函数的参数,直接操作外部的splitStr function popLast(){ splitStr.pop(); } function shiftFirst(){ splitStr.shift(); } // 执行移除操作 shiftFirst(); popLast(); // 转回字符串返回 return splitStr.join(""); }; console.log(removeChar(str)); // 输出:xampl
方案二:简化写法,去掉多余的内部函数
其实没必要额外写内部函数,直接在removeChar里操作数组就行,代码更简洁:
let str = 'example'; let removeChar = function(str){ let splitStr = str.split(""); splitStr.shift(); // 移除首字符 splitStr.pop(); // 移除尾字符 return splitStr.join(""); }; console.log(removeChar(str)); // 输出:xampl
方案三:更高效的字符串切片写法
如果不需要数组操作的中间步骤,直接用字符串的slice方法会更高效,一行代码搞定:
let removeChar = function(str){ // slice(1, -1) 表示从索引1开始,到倒数第一个字符结束(不包含) return str.slice(1, -1); }; console.log(removeChar('example')); // 输出:xampl
内容的提问来源于stack exchange,提问作者Mino
相关产品推荐
相关产品推荐

