更新时间:2025-05-28 09:05点击:6
(摔键盘)哎呦我去!刚学JS那会儿,我差点把显示器砸了!你猜怎么着?写个简单的轮播图,结果把整个网页搞成了俄罗斯方块!今天就跟你掏心窝子聊聊,怎么避开这些坑,让代码听话得像你家二哈!
说人话版本:变量就像给数据贴标签。但别小看它,去年有个哥们用var声明变量,结果循环计数器发疯,页面直接崩成雪花屏!
举个栗子:
javascript复制var x = 10; if (true) { var x = 20; // 这货会把外面的x也改了! } console.log(x); // 输出20 气不气?
声明方式 | 作用域 | 能改吗 | 新手推荐指数 |
---|---|---|---|
var | 函数级 | 能改 | ★☆☆☆☆ |
let | 块级 | 能改 | ★★★★☆ |
const | 块级 | 不能改 | ★★★★★ |
箭头函数这坑爹货:
javascript复制const obj = { name: \'张三\', sayName: () => { console.log(this.name); // 输出undefined 惊不惊喜? } }
为啥?因为箭头函数没有自己的this!用普通函数写法才能正确指向obj
闭包这个磨人精:
javascript复制function createCounter() { let count = 0; return function() { return ++count; }; } const counter = createCounter(); console.log(counter()); // 1 console.log(counter()); // 2
这个count变量就像被封印在琥珀里,永远活在内存中!用好了是神器,用不好就是内存泄漏的元凶!
选择器全家桶:
javascript复制// 获取元素的三板斧 document.querySelector(\'.btn\'); // 精准打击 document.getElementById(\'main\'); // 老古董 document.getElementsByClassName(\'item\'); // 返回伪数组
重点来了:querySelectorAll返回的节点列表不是真数组!要转数组得用Array.from()
事件监听这个戏精:
javascript复制button.addEventListener(\'click\', function() { console.log(\'第1次点击\'); }); button.addEventListener(\'click\', function() { console.log(\'第2次点击\'); }); // 这两个监听器会按添加顺序执行!
有个哥们写了三个点击事件,结果页面跟抽风似的随机响应!最后发现是事件冒泡搞的鬼
Promise的套路:
javascript复制new Promise((resolve, reject) => { setTimeout(() => resolve(1), 1000); }) .then(result => { return result * 2; }) .catch(error => { console.log(\'出错了\'); });
注意!then里return的值会被包装成新的Promise,这就是链式调用的精髓
async/await的坑:
javascript复制async function getData() { const res = await fetch(\'xxx\'); const data = await res.json(); return data; } // 忘记写await的话,拿到的是个Pending状态的Promise!
见过最惨的案例:有人写了10个async函数,结果页面加载比蜗牛还慢!最后发现是忘了加await
console的花式操作:
javascript复制console.table([{name:\'张三\',age:20},{name:\'李四\',age:25}]); // 表格输出美如画 console.log(\'%c重要提示\', \'color:red;font-size:20px\'); // 网页里玩出CMD风格
断点调试秘籍:
在Chrome调试台按F12 -> Sources -> 点行号打蓝点
按F10逐过程调试,F11逐语句调试
有次我盯着断点看了半小时,才发现自己忘记刷新页面!
最后说句得罪人的:网上那些\"三天精通JS\"的教程都是扯淡!我花了三个月才搞明白原型链,又花了半年征服异步编程。下次看见报错别慌,记住这四字真言:逐行检查!从出错行往上捋,比求神拜佛管用多了!