Tôi có thể tắt tối ưu hóa không, vì vậy các biến trong phạm vi từ các bao đóng không được Tối ưu hóa ra ra


11

Là sản phẩm phụ của tối ưu hóa mã được thực hiện bởi các trình duyệt hiện đại, trong khi gỡ lỗi, bạn không thể "nhìn thấy" tất cả các biến "thực tế" nằm trong phạm vi. Điều này là nổi tiếng và đã được giải quyết trong một câu hỏi trước đây ở đây trên SO . Tính năng này, trong khi chắc chắn hữu ích nhất trong sản xuất gây khó chịu cho tôi rất nhiều trong quá trình phát triển, nó làm tôi chậm lại (điều đó là hiển nhiên.)

Bây giờ câu hỏi của tôi là, có cách nào để tắt hành vi này? Tôi có thể chỉnh sửa một số tệp cấu hình hoặc có plugin trình duyệt hoặc có thể có "phiên bản xây dựng đặc biệt dành cho nhà phát triển" của trình duyệt thực thi không? Tôi thích nhập mã của mình vào bảng điều khiển ngay lập tức khi tôi viết mã mới, vì vậy điều này thực sự làm tôi khó chịu.

visualSummaryIffalseConsoleLog

CẬP NHẬT / EDIT

Đây là một giải pháp một phần, tín dụng cho Paul1365972.

Bạn phải khởi động trình duyệt chrome từ dòng lệnh, với các tùy chọn đặc biệt, như vậy:

  1. Đóng Chrome hoàn toàn
  2. Chạy Chrome từ bảng điều khiển với "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" các hệ điều hành tương tự cho windows.
  3. Mở bảng điều khiển dành cho nhà phát triển và thực thi "%GetHeapUsage()". Nếu bạn khởi động Chrome đúng cách với tùy chọn, một số sẽ được ghi vào bảng điều khiển, nếu không bạn sẽ gặp lỗi cú pháp.

Với cờ dòng lệnh này, bạn có thể 'nói chuyện với động cơ V8' bằng các lệnh bắt đầu bằng %, đó là các lỗi cú pháp trong JavaScript đơn giản. Một danh sách các lệnh V8 có sẵn thuộc loại này đã được đưa ra trong câu trả lời của Paul .

%NeverOptimizeFunction()trong danh sách đó, đó là thứ trông giống như thứ tôi phải gọi và được thực hiện với nó. Thật không may, chức năng đó không làm được những gì tôi hy vọng, như thể hiện trong ảnh chụp màn hình tiếp theo.

lorem vẫn chưa được xác định

((( Liên kết khác từ câu trả lời của Paul (mô-đun nút v8-nigen) không quan trọng đối với chúng tôi ở đây trong bối cảnh này. các trình duyệt không phải là v8.)))

(((Tôi nhớ một thời gian khi điều này hoạt động (khi tối ưu hóa này chưa được phát minh / triển khai). Tôi không biết cách đây bao lâu. Mười năm? 15 năm? Một cái gì đó giống như vậy. Phiên bản Chrome cuối cùng là gì (nếu bất kỳ) và phiên bản firefox cuối cùng là gì (chắc chắn hơn ở đây là nó tồn tại) nơi bạn có thể làm gì? Nó sẽ không mang lại cho bạn tiền thưởng, nhưng nó sẽ giúp bạn có được một upvote, nếu bạn tình cờ biết và đăng nó như một câu trả lời .)))

GIẢI PHÁP

CẢM ƠN BẠN

sửa lỗi

CÂU HỎI MỚI

Mặc dù giải pháp của Petr giúp ích rất nhiều, nhưng nó không hoàn hảo. Câu hỏi này đang trở nên quá dài, vì vậy tôi đã đăng một câu hỏi mới về cách cải thiện giải pháp của Petr. (Tất nhiên tôi có thể chỉnh sửa câu hỏi này ở đây, nhưng điều đó sẽ cảm thấy "phi lịch sử", nếu bạn hiểu ý tôi.)


hậu quả không lường trước, chương tenthousandone. tối ưu hóa này có ảnh hưởng tiêu cực đến phong cách mã hóa của tôi. Tôi thấy mình sử dụng vòng lặp lỗi thời (thay vì .map, .forEach, .reduce) nhiều hơn tôi có thể, vì vậy tôi tránh gặp phải vấn đề này.
mathheadinclouds

Các v8-nativesthư viện chỉ kết thúc tốt đẹp% các cuộc gọi quan trọng trong mã trong một thư viện đơn giản mà nên noopstrong một trình duyệt hoặc nút mà đã không được bắt đầu vào cờ --allow-thổ-cú pháp đặc biệt ..
Nathanael

Tôi đã chạy một số thử nghiệm, chức năng 'bodyOnLoad' không được tối ưu hóa dù sao; Vì vậy, sử dụng các lệnh bên trong để thử và buộc nó tối ưu hóa không làm gì cả.
Nathanael

@Nathanael: Cuộc gọi quan trọng là %NeverOptimizeFunction(foo)tôi vừa gọi nó cho bodyOnload, "chỉ vì", nghĩ rằng "tốt, nó sẽ không bị tổn thương". Vấn đề là fooKHÔNG được tối ưu hóa theo cách tôi đã hy vọng. Biến loremlà vô hình. Hãy nói rằng tôi muốn viết một số mã sẽ đi vào chức năng foo. Thay vì nhập nó vào trình soạn thảo văn bản của mình, tôi gõ nó vào bảng điều khiển dev (trong khi trình gỡ lỗi đang ngồi ở foo), xem nó có làm những gì tôi muốn không, sau đó sao chép / dán nó từ bàn điều khiển vào trình soạn thảo văn bản của tôi. Đó là cách tôi thích làm việc. Và không thể. Vì tối ưu hóa. Hiểu rồi?
mathheadinclouds

1
Tôi đã dành vài lần thử nghiệm với nhiều thứ khác nhau --js-flags(bao gồm một số thứ liên quan đến TurboFan ) cũng như với một số lệnh gốc V8 trước khi Paul1365972 đăng câu trả lời của anh ấy nhưng tôi không thể đạt được hành vi mong muốn. Tôi tin rằng phương pháp này có thể là một ngõ cụt. Có thể đáng để thêm một [v8]thẻ vào câu hỏi này. Ai đó với sự hiểu biết sâu sắc về hoạt động bên trong của V8 có thể có thể làm rõ liệu đây là con đường để đi hay có thể chỉ cho bạn đi đúng hướng.
Petr Srníček

Câu trả lời:


2

Bạn có thể có quyền truy cập vào tất cả các biến bằng cách gói câu lệnh gỡ lỗi trong một eval như thế này : eval("debugger;");. Giải pháp hacky này thêm một chức năng ẩn danh khác vào ngăn xếp cuộc gọi và rõ ràng là không sử dụng được cho các điểm dừng được đặt thủ công trong DevTools.

Điều này dường như không phải là một giải pháp rất tốt, nhưng vì nó là người duy nhất đạt được hành vi dự định cho đến nay, tôi đăng nó như một câu trả lời.


nó làm tôi ngạc nhiên khi nó hoạt động Bạn biết đấy, tôi đã thử gõ eval ("lorem") và điều đó đưa ra cùng một lỗi "lorem không được xác định". Nó không có ý nghĩa gì với tôi rằng việc gõ eval ("lorem") trên bàn điều khiển (trong khi trên trình gỡ lỗi trong hàm foo) sẽ làm bất cứ điều gì khác với những gì eval ("trình gỡ lỗi") đang làm - mong đợi, in "ipsum" đến bàn điều khiển. Nhưng họ rất khác nhau. Lạ thật.
mathheadinclouds

Đó là một công việc thú vị xung quanh. Đó là một chút hack, vì bạn không thể bước ra khỏi câu lệnh gỡ lỗi (bạn chỉ cần chuyển thủ công sang tệp nguồn) nếu không bạn sẽ mất toàn bộ ngăn xếp và quay trở lại chức năng được gọi là eval; để lại cho bạn ngăn xếp giảm thiếu bối cảnh khác.
Nathanael

do đó, người ta có thể sửa đổi thủ thuật này: thay vì eval ("trình gỡ lỗi"), chỉ đặt eval ("") - nhưng nhiều trong số chúng, được phân phối trên khắp mã, ở mọi nơi mà bạn nghĩ rằng bạn có thể muốn có một 'điểm dừng mở rộng'. Sau đó, bạn có thể đặt điểm dừng (với các công cụ dev) trong đó một trong những câu lệnh eval ('') đó và khi bạn dừng ở đó, bạn thực hiện "bước vào". Tôi đang xem xét để viết một bộ chuyển mã nhỏ (từ lớn cho một việc nhỏ tôi đang làm) đặt các câu lệnh đó vào đầu mỗi hàm. stackoverflow.com/questions/59159996/
Mạnh

Tôi vừa thử thay thế eval ("trình gỡ lỗi") bằng eval (); trình gỡ lỗi và nhận được các kết quả khác nhau, tùy thuộc vào việc sử dụng firefox hoặc chrome. i.stack.imgur.com/wy5WT.png
mathheadinclouds

3

Google Chrome sử dụng Công cụ động cơ V8, bạn có thể kích hoạt các cuộc gọi riêng với nó bằng cờ --allow-nigen -cú pháp, điều này cho thấy nhiều chức năng gỡ lỗi hữu ích (danh sách đầy đủ ở đây ) như cách bạn đang tìm kiếm:% NeverOptizesFunction () . Nếu không có cờ này, các cuộc gọi này sẽ là cú pháp bất hợp pháp, vì vậy hãy cẩn thận khi triển khai (hoặc sử dụng thư viện v8-Nigen ).

Để bật tính năng này, chỉ cần mở chrome bằng --js-flags = "- allow-nigen-cú pháp" (chỉ sử dụng tính năng này để gỡ lỗi các trang web đáng tin cậy, vì điều này có thể cấp quyền truy cập mã js không đáng tin cậy vào những thứ bạn thực sự không muốn có quyền truy cập).


cảm ơn bạn. Xin vui lòng đọc câu hỏi cập nhật của tôi. Có vẻ như bạn đã có giải pháp ở đây, nhưng tôi cần làm rõ thêm để có được giải pháp. Nếu điều này hoạt động, bạn chắc chắn xứng đáng với tiền thưởng.
mathheadinclouds

thay vào đó, tl; dr sử dụng --js-flags = "- allow-nigen-cú pháp". Để kích hoạt tính năng, động cơ V8 JS cần được khởi động với cờ cú ​​pháp --allow-nigen-cú pháp, tuy nhiên bạn không thể khởi động trực tiếp, đây là công việc chỉnh sửa. Vì vậy, bạn phải nói với chrome để khởi động động cơ với cờ, làm thế nào để bạn làm điều đó? Chỉ cần chuyển cờ công cụ được đề cập qua --js-flags = <cờ của bạn ở đây> sang chrome.
Paul1365972

không Chỉ cần cố gắng thêm một lần nữa, để trở thành một bên an toàn. Tôi đã thử cả hai --allow-natives-syntax--js-flags="--allow-natives-syntax"nhiều lần là "thứ tôi gõ sau 'chrome' trong bảng điều khiển hệ điều hành". Nếu tôi đã không tự mình thử tất cả, tôi cũng nghĩ rằng một lỗi đánh máy là lời giải thích khả dĩ nhất. Tôi làm một ảnh chụp màn hình khác. i.stack.imgur.com/7cpPP.png Xem lỗi đánh máy? Xin vui lòng cho tôi một câu trả lời trung thực: bạn đã "đọc và hiểu bài viết" chưa (rõ ràng, không có gì sai với điều đó, nếu bạn không yêu cầu thêm), hoặc bạn đã thực sự thử tất cả những điều đó trên máy của mình chưa? thx
mathheadinclouds

chỉ là một phỏng đoán: có thể là tôi không bắt đầu chrome thực thi với tùy chọn đó, nhưng tôi đã biên dịch các nguồn chrome C ++ (hoặc bất cứ thứ gì) với tùy chọn đó?
mathheadinclouds

1
Thật lạ khi tôi chỉ thử nó và nó hoạt động tốt, không cần biên dịch. Tôi sẽ chỉ viết chính xác những gì tôi đã làm để không có sự hiểu lầm. 1. Đóng Chrome hoàn toàn 2. Chạy Chrome từ bảng điều khiển với "C: / Tệp chương trình (x86) /Google/Chrom/Application/chrome.exe" --js-flags = "- allow-nigen-cú pháp" 3. Mở bảng điều khiển dành cho nhà phát triển và thực thi "% GetHeapUsage ()" để kiểm tra xem mọi thứ có hoạt động không
Paul1365972

0

Tôi thực sự hy vọng câu hỏi này có một câu trả lời THỰC SỰ. Điều gì sau đây không phải là một câu trả lời thực sự, đó là một tạm thời. Tôi đã viết một công cụ trợ giúp để bạn có thể tạo mã trợ giúp ngu ngốc của biểu mẫu if (false) { console.log(variables, from, closures); }(xem ảnh chụp màn hình trong câu hỏi) bằng phân tích tĩnh - bạn dán mã của mình, câu lệnh ngu ngốc được tạo, bạn có thể sao chép nó, sau đó bạn không cần để gõ nó Tôi không biết điều đó có giúp ích gì nhiều không, vì tất cả việc sao chép và dán này cũng mất thời gian, nhưng đó là những gì tôi có.

ảnh chụp màn hình

vĩ cầm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.